使用pd.to_datetime转换CSV日期格式时出现不一致问题求助
解决pandas日期解析格式不一致的问题
这个问题我之前也踩过坑!核心原因是pandas自动推断日期格式时,遇到日和月都≤12的日期(比如01/01/2015),没法确定你用的是月/日/年还是日/月/年,默认采用了美式的月/日/年规则;但当日期数值超过12时(比如01/13/2015),因为不存在13月,pandas只能强制切换成日/月/年逻辑解析,这就导致同一列的日期解析规则混乱,后续调用.month或.year自然会出错。
直接上针对性解决方案:
明确指定日期格式,禁止自动推断
你必须告诉pandas原始日期的真实格式,避免它“猜格式”。先确认你的原始日期规则:- 如果原始格式是月/日/年(MM/DD/YYYY,比如
01/01/2015代表2015年1月1日):wind['Date'] = pd.to_datetime(wind['Date'], format='%m/%d/%Y') - 如果原始格式是日/月/年(DD/MM/YYYY,比如
01/01/2015代表2015年1月1日,13/01/2015代表2015年1月13日):wind['Date'] = pd.to_datetime(wind['Date'], format='%d/%m/%Y')
- 如果原始格式是月/日/年(MM/DD/YYYY,比如
保留pandas datetime64类型,无需转成Python原生date对象
你之前用.dt.date把pandas的datetime类型转成了Python原生date对象,这完全没必要——pandas的datetime64类型支持更高效的矢量操作,直接用以下方式提取年月即可:# 提取月份 wind['Month'] = wind['Date'].dt.month # 提取年份 wind['Year'] = wind['Date'].dt.year转成原生date对象不仅会丢失pandas的操作优势,还可能引发类型不一致的问题。
最后可以拿几个有问题的日期验证:比如原始数据里的01/13/2015,如果解析后是2015-01-13,说明你的原始格式是月/日/年;如果原始数据是13/01/2015,解析后应该是2015-01-13,那就是日/月/年格式。指定格式后,所有日期的解析规则会完全统一,后续操作就不会再出错了。
内容的提问来源于stack exchange,提问作者tm553
相关产品推荐
相关产品推荐

