如何将含多数据类型的列统一转换为日期类型?
问题
现有数据中Event Date列的类型分布:
<class 'datetime.datetime'> 296 <class 'str'> 116 <class 'float'> 8
需要实现:
- 忽略
Event Date为空的行 - 拆分含多个日期的字符串行,复制对应记录
- 将所有日期统一转为
datetime类型
数据示例:
| Col1 | Event Date |
|---|---|
| 1 | 2020-07-16 00:00:00 |
| 2 | |
| 3 | 31/03/2022, 26/11/2018, 31/01/2028 |
尝试explode方法时报错:dateutil.parser._parser.ParserError: Unknown string format: 31/03/2022, 26/11/2018, 31/01/2028 present at position 3,代码如下:
df=auto_test_file.assign(dates=auto_test_file['Event Date'].str.split(',')).explode('dates') pd.to_datetime(df['Event Date'])
解决方案
1. 过滤空行
先移除Event Date为空(包括NaN)的行:
df_clean = auto_test_file.dropna(subset=['Event Date'])
2. 拆分多日期并展开
针对字符串类型的日期做拆分,datetime类型直接保留为单元素列表,确保explode能统一处理:
df_split = df_clean.assign( dates=df_clean['Event Date'].apply( lambda x: x.split(',') if isinstance(x, str) else [x] ) ).explode('dates') # 清除拆分后日期前后的空格 df_split['dates'] = df_split['dates'].str.strip()
3. 统一转换日期类型
使用dayfirst=True参数适配日/月/年格式,自动识别并转换所有日期:
df_split['Event Date'] = pd.to_datetime(df_split['dates'], dayfirst=True) # 删除临时列,得到最终结果 df_final = df_split.drop(columns=['dates'])
完整代码
# 过滤空行 df_clean = auto_test_file.dropna(subset=['Event Date']) # 拆分多日期行并展开 df_split = df_clean.assign( dates=df_clean['Event Date'].apply( lambda x: x.split(',') if isinstance(x, str) else [x] ) ).explode('dates') # 清理空格并转换日期 df_split['dates'] = df_split['dates'].str.strip() df_split['Event Date'] = pd.to_datetime(df_split['dates'], dayfirst=True) # 最终结果 df_final = df_split.drop(columns=['dates'])
内容的提问来源于stack exchange,提问作者lostcoder
相关产品推荐
相关产品推荐

