pd.to_datetime转换日期格式出错,如何正确转换日/月/年格式时间?
问题描述
有如下DataFrame:
import pandas as pd df = pd.DataFrame({"DateTime":["26/06/2014 22:05:16", "25/06/2014 22:05:56", "01/07/2014 22:05:30", "01/08/2014 19:04:23"], "Data":[20, 31, 25, 44]})
输出结果:
DateTime Data 0 26/06/2014 22:05:16 20 1 25/06/2014 22:05:56 31 2 01/07/2014 22:05:30 25 3 01/08/2014 19:04:23 44
需要将DateTime列转换为datetime64类型,原始数据是日/月/年格式,最终要输出年-月-日格式的字符串。尝试了以下代码:
df["DateTime"] = pd.to_datetime(df["DateTime"]) df["DateTime"] = df["DateTime"].dt.strftime('%Y-%m-%d %H:%M:%S')
得到错误结果:
DateTime Data 0 2014-06-26 22:05:16 20 1 2014-06-25 22:05:56 31 2 2014-01-07 22:05:30 25 3 2014-01-08 19:04:23 44
前两个日期转换正常,但后两个日期的月份和日期颠倒了,正确结果应为:
2 2014-07-01 22:05:30 25 3 2014-08-01 19:04:23 44
解决方法
错误原因是直接使用pd.to_datetime()时,它会默认自动识别日期格式,当遇到01/07/2014这种同时符合两种格式的字符串时,会优先按月/日/年解析,导致日期月份颠倒。
正确的做法是在pd.to_datetime()中明确指定原始日期的格式,确保解析准确:
# 第一步:按原始格式(日/月/年 时分秒)解析为datetime64类型 df["DateTime"] = pd.to_datetime(df["DateTime"], format='%d/%m/%Y %H:%M:%S') # 第二步:转换为目标格式的字符串 df["DateTime"] = df["DateTime"].dt.strftime('%Y-%m-%d %H:%M:%S')
执行后得到正确结果:
DateTime Data 0 2014-06-26 22:05:16 20 1 2014-06-25 22:05:56 31 2 2014-07-01 22:05:30 25 3 2014-08-01 19:04:23 44
补充说明
如果不需要将日期转为字符串,只是想让DataFrame显示为年-月-日格式,同时保留datetime64类型(方便后续时间相关操作),可以跳过strftime步骤,直接设置pandas的显示格式:
df["DateTime"] = pd.to_datetime(df["DateTime"], format='%d/%m/%Y %H:%M:%S') pd.options.display.date_format = '%Y-%m-%d %H:%M:%S'
内容的提问来源于stack exchange,提问作者user026
相关产品推荐
相关产品推荐

