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
相关产品推荐
相关产品推荐

