使用panda将日期从dd/mm/yy转换为dd/mm/yyyy时遇到问题。
我试过这个:
df['Date'] = pd.to_datetime(df['Date'])
但不知何故,对于某些值,日期和月份正在交换。。。有其他方法可以正确转换吗?
提前感谢您回答我:(
短版本
您可以指定format
,但这并不意味着不会因为两位数年份中固有的Y2K错误而出现任何问题
df['Date'] = pd.to_datetime(df['Date'],format='%d/%m/%y')
字符串'10/12/68'
将被解析为2068年12月10日。
如果可能的话,让创建该值的人使用明确的ISO8601格式,即YYYY-MM-DD
详细说明
正确的方法是简单地不使用这样的字符串。连人类都猜不到xx/xx/xx
的意思。12/5/12
是什么意思?12月5日还是5月12日?1912年还是2012年?10/12/68
怎么样?
这不是挑剔。即使现在,这样的错误仍然会造成严重的问题:
- 西班牙家庭因阅读日期错误而被错误指控为儿童色情制品2020年9月
- Y2K?2020年1月,劳埃德遭遇年度第二次TITSUP*,20万日元怎么样
- Y2K快速修复蟋蟀?2020年1月,英国汽车牌照局出现神秘事件后,20世纪20年代卷土重来
真正的解决方案是将生成此类日期的应用程序修改为使用明确的YYYY-MM-DD格式,或者使用具有强类型日期的源。例如,Excel和几乎所有数据库都有日期类型。
解决方案
如果不可能,则需要使用format
参数指定日期模式。
df['Date'] = pd.to_datetime(df['Date'],format='%d/%m/%y')
尽管如此,仍然有可能出现错误,因为两位数的年份将根据截止规则进行翻译。
例如,在这个SO问题中,'10/12/68'
被解析为2068-12-10
而不是1968
:
>>> datetime.strptime('10/12/68', '%d/%m/%y')
datetime.datetime(2068, 12, 10, 0, 0)
Oops