如何在Pandas DataFrame中将多格式日期转换为统一日期格式
解决Pandas中多格式日期批量转换的问题
首先,咱们先拆解下你遇到的错误:AttributeError: 'str' object has no attribute 'strftime',这是因为你直接对字符串类型的日期调用了strftime方法——这个方法是datetime对象专属的,字符串本身根本没有这个属性,自然会报错。另外,你的代码还没处理每个单元格里多个日期用逗号分隔的情况,也没考虑到那个字符串形式的'NaN',咱们一步步来修正。
解决方案步骤
- 把每个单元格的字符串按逗号分割成单独的日期片段;
- 对每个日期片段,用
dateutil.parser.parse解析成datetime对象,再转成YYYY-MM-DD的统一格式; - 处理空值/无效值(比如字符串
'NaN'); - 把处理后的日期片段重新拼接成字符串,存入新列。
完整可运行代码
import pandas as pd import dateutil.parser # 初始化数据,把字符串'NaN'替换成真正的pd.NA,更符合Pandas规范 data = {'Date':['March 13, 2020, March 13, 2020', '3.9.2021, 3.9.2021, 03.09.2021, 3. September 2021', pd.NA, 'May 20, 2022, May 21, 2022']} # 创建DataFrame df = pd.DataFrame(data) # 定义批量格式化日期的函数 def format_multiple_dates(date_str): # 处理缺失值情况 if pd.isna(date_str): return pd.NA # 分割日期字符串,去掉每个日期前后的空格 individual_dates = [d.strip() for d in date_str.split(',')] formatted_list = [] for single_date in individual_dates: try: # 解析任意格式的日期字符串为datetime对象 # 如果需要按"月.日.年"解析,可添加参数dayfirst=False parsed_dt = dateutil.parser.parse(single_date) # 转成YYYY-MM-DD格式 formatted_dt = parsed_dt.strftime('%Y-%m-%d') formatted_list.append(formatted_dt) except Exception as e: # 如果遇到无法解析的日期,保留原字符串(可选:也可以返回pd.NA) formatted_list.append(single_date) # 把格式化后的日期拼接回字符串 return ', '.join(formatted_list) # 应用函数到Date列,生成新列 df["DateFormatted"] = df["Date"].apply(format_multiple_dates) # 查看结果 print(df)
运行结果说明
执行后你会得到和期望一致的输出:
| 序号 | Date | DateFormatted |
|---|---|---|
| 0 | March 13, 2020, March 13, 2020 | 2020-03-13, 2020-03-13 |
| 1 | 3.9.2021, 3.9.2021, 03.09.2021, 3. September 2021 | 2021-09-03, 2021-09-03, 2021-09-03, 2021-09-03 |
| 2 | NaN | NaN |
| 3 | May 20, 2022, May 21, 2022 | 2022-05-20, 2022-05-21 |
(注:dateutil.parser默认把.分隔的日期按日.月.年解析,如果你需要按月.日.年处理,修改解析代码为parsed_dt = dateutil.parser.parse(single_date, dayfirst=False)即可)
内容的提问来源于stack exchange,提问作者Aniiya0978
相关产品推荐
相关产品推荐

