如何在Python中正确将字符串日期'12/7/21'转为'2021-07-12'?
问题:将'12/7/21'格式字符串转换为'2021-07-12'日期对象
需要把类似12/7/21的日期字符串转换为2021-07-12格式的日期对象,原StackOverflow上的解决方案存在问题,具体情况如下:
原错误代码示例:
# StackOverflow上的建议解决方案 import pandas as pd df = pd.DataFrame({'Date':['15/7/21']}) df['Date'] # 输出:0 15/7/21,dtype: object pd.to_datetime(df['Date'].astype('datetime64'),format='%d/%m/%y') # 输出:0 2021-07-15,dtype: datetime64[ns]
问题根源是代码中多了一步.astype('datetime64')——这会让pandas先自动解析日期字符串,后续传入的format='%d/%m/%y'参数完全失效。当输入改为12/7/21时,pandas会默认按月/日/年解析,得到错误结果:
df = pd.DataFrame({'Date':['12/7/21']}) pd.to_datetime(df['Date'].astype('datetime64'),format='%d/%m/%y') # 输出:0 2021-12-07,dtype: datetime64[ns]
正确解决方案
以下几种方法都能实现类似R中lubridate::dmy(df$Date)的效果:
- 直接指定format参数(推荐)
去掉多余的.astype('datetime64'),直接用pd.to_datetime并明确日期格式:
import pandas as pd df = pd.DataFrame({'Date':['12/7/21']}) df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%y') # 输出:0 2021-07-12,符合预期
- 使用dayfirst参数
如果不确定日期格式,但明确日期在前、月份在后,可以用dayfirst=True让pandas优先解析第一个数字为日期:
df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)
- 利用dateutil.parser解析
借助dateutil库的解析器,同样指定dayfirst=True:
from dateutil.parser import parse df['Date'] = df['Date'].apply(lambda x: parse(x, dayfirst=True))
内容的提问来源于stack exchange,提问作者Amin Shn
相关产品推荐
相关产品推荐

