You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas读取CSV中YYYY-MM-DD格式日期被转为5位数字符串如何解决

解决方案

问题根源

你遇到的5位数字是Excel格式的序列日期,以1900-01-01为第1天计数,和pandas to_datetime 默认的1970纪元基准不匹配,所以之前直接用unit='D'转换会得到错误结果。

解决方法

分两种场景处理:

场景1:尚未读取CSV文件

你之前的parse_dates参数没有包含alert_date字段,直接把该字段加入解析列表,pandas会自动识别CSV原始的YYYY-MM-DD格式:

dtype_dict = {'alert_date':'str','lossdate1':'str', 'lossdate2':'str',
              'lossdate3':'str', 'lossdate4':'str', 'lossdate5':'str',
              'effdate':'str'}
# 新增alert_date到日期解析列表
parse_dates = ['alert_date', 'lossdate1', 'lossdate2', 'lossdate3', 
               'lossdate4', 'lossdate5', 'effdate']
df  = pd.read_csv("Agent Alerts Earned and Incurred with Loss Dates as of Q3 2021.csv",
                  encoding='latin1', dtype = dtype_dict, parse_dates=parse_dates)

场景2:已读取数据到DataFrame

如果已经读入的alert_date是类似'21706'的字符串格式数字,先转成整数,再基于Excel日期基准偏移即可,需减去2天抵消Excel的历史闰年计算bug:

df['alert_date'] = pd.to_datetime('1900-01-01') + pd.to_timedelta(df['alert_date'].astype(int), unit='D') - pd.Timedelta(days=2)

如果你的CSV是旧版Mac系统的Excel导出的(采用1904日期基准,极少遇到),改用以下代码即可:

df['alert_date'] = pd.to_datetime('1904-01-01') + pd.to_timedelta(df['alert_date'].astype(int), unit='D')

你给出的示例值21706代入第一个转换公式,即可得到正确的2019-06-06日期。


内容的提问来源于stack exchange,提问作者Jordan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 16:15:03