strptime日期格式化异常求助:无法处理含时分秒的日期转换
问题排查与解决方案
错误原因
- 正则匹配优先级错误:原代码中先检查短日期正则
\d{4}-\d{2}-\d{2},带时分秒的日期字符串会被该正则匹配开头部分,导致程序用%Y-%m-%d格式去解析包含时分秒的完整字符串,剩余的12:46:21无法被转换,触发ValueError。 - 未做目标格式转换:原函数返回的是
datetime对象,若要得到%Y-%m-%d格式的字符串,需要额外格式化处理。
修复方案
方案一:修正自定义解析函数
调整正则检查顺序,使用全匹配确保规则匹配完整字符串,最后转换为目标格式:
from datetime import datetime import re import pandas as pd def conv_date(dte: str) -> str: # 优先匹配带时分秒的长格式,避免短格式提前匹配 acceptable_mappings = [ (r"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}", "%Y-%m-%d %H:%M:%S"), (r"\d{4}-\d{2}-\d{2}", "%Y-%m-%d"), ] for regex, fmt in acceptable_mappings: # 用fullmatch确保整个字符串完全符合正则规则 if re.fullmatch(regex, dte): dt = datetime.strptime(dte, fmt) # 转换为目标格式字符串 return dt.strftime("%Y-%m-%d") raise Exception(f"Expected date in one of supported formats, got {dte}") mock_dict = [ {"name": "xx", "role": "loves only-fans", "date": "2023-07-26 12:46:21"}, {"name": "dz", "role": "legend", "date": "2023-07-26"}, ] df = pd.DataFrame(mock_dict) if __name__ == "__main__": print("原始数据:") print(df) # 替换原date列或新增date_clean列 df['date'] = df['date'].apply(conv_date) print("\n处理后数据:") print(df)
运行结果:
原始数据: name role date 0 xx loves only-fans 2023-07-26 12:46:21 1 dz legend 2023-07-26 处理后数据: name role date 0 xx loves only-fans 2023-07-26 1 dz legend 2023-07-26
方案二:使用Pandas内置函数简化处理
无需自定义正则和解析函数,Pandas的to_datetime可以自动识别多种日期格式,直接转换为目标格式:
import pandas as pd mock_dict = [ {"name": "xx", "role": "loves only-fans", "date": "2023-07-26 12:46:21"}, {"name": "dz", "role": "legend", "date": "2023-07-26"}, ] df = pd.DataFrame(mock_dict) df['date'] = pd.to_datetime(df['date']).dt.strftime("%Y-%m-%d") print(df)
运行结果与方案一一致,代码更简洁高效。
内容的提问来源于stack exchange,提问作者Mizanur Choudhury
相关产品推荐
相关产品推荐

