如何将DataFrame中的月日字符串转为datetime?解决补年及日期越界问题
解决方案:处理无年份的月日列转换及日期有效性问题
1. 解决自动添加1900年的问题
datetime类型必须包含年、月、日三个维度,仅传入月日时会默认补全1900年。如果需要指定年份(比如当前年份),可以通过以下两种方式处理:
方法1:拼接指定年份后转换
import pandas as pd from datetime import datetime df = pd.DataFrame({'id':[78,18,94,55,68,57,78,8], 'monthday':['1-29','1-28','1-27','1-19','1-28','1-19','1-29','1-28']}) # 指定2024年进行转换 df['month_day'] = pd.to_datetime('2024-' + df['monthday'], format='%Y-%m-%d')
方法2:仅保留月日信息(用Period类型)
如果不需要完整的日期维度,只想保留月日的周期信息,可以使用Period类型:
# 转换为仅含月日的Period对象 df['month_day_period'] = pd.PeriodIndex(df['monthday'], freq='D')
2. 解决"day is out of range for month"错误
这个错误是因为数据中存在无效的月日组合(比如2月30日、4月31日这类不存在的日期),可以通过两种方式处理:
方式1:强制转换,无效值转为NaT
使用errors='coerce'参数,将无效日期转为NaT(Not a Time),后续可筛选出无效数据排查:
df['month_day'] = pd.to_datetime('2024-' + df['monthday'], format='%Y-%m-%d', errors='coerce') # 查看无效日期的行 invalid_rows = df[df['month_day'].isna()] print(invalid_rows)
方式2:提前验证并清洗数据
编写验证函数,提前筛选或标记无效日期:
def check_valid_date(monthday_str, year=2024): try: datetime.strptime(f'{year}-{monthday_str}', '%Y-%m-%d') return True except ValueError: return False # 标记每行日期是否有效 df['is_valid_date'] = df['monthday'].apply(check_valid_date) # 仅保留有效日期的行 valid_df = df[df['is_valid_date']]
内容的提问来源于stack exchange,提问作者Rebecca James
相关产品推荐
相关产品推荐

