我有一个类似的问题:将日期列(字符串(转换为日期时间并匹配格式,我想将类似"12/7/21"的字符串转换为"2021-07-12"作为日期对象。我相信上面链接中给出的答案是错误的,原因如下:
# The suggested solution on Stackoverflow
>>> import pandas as pd
>>> df = pd.DataFrame({'Date':['15/7/21']})
>>> df['Date']
0 15/7/21
Name: Date, dtype: object
>>> pd.to_datetime(df['Date'].astype('datetime64'),format='%d/%m/%y')
0 2021-07-15
Name: Date, dtype: datetime64[ns]
因为Python并不关心上面代码中指定的格式!如果你只需将15改为12并输入"12/7/21",它就会将12视为月而非日:
>>> df = pd.DataFrame({'Date':['12/7/21']})
>>> df['Date']
0 12/7/21
Name: Date, dtype: object
>>> pd.to_datetime(df['Date'].astype('datetime64'),format='%d/%m/%y')
0 2021-12-07
Name: Date, dtype: datetime64[ns]
有人知道这个问题的最佳解决方案是什么吗?(在R中,您只需使用lubridate::dmy(df$Date(,它就可以完美工作(
.astype('datetime64')
尝试解析字符串MM/DD/YY
,但如果不能解析(在MM>12的情况下(,它将返回解析为DD/MM/YY
,这就是为什么您会看到看似不一致的行为:
>>> import pandas as pd
>>> pd.Series('15/7/21').astype('datetime64')
0 2021-07-15
dtype: datetime64[ns]
>>> pd.Series('14/7/21').astype('datetime64')
0 2021-07-14
dtype: datetime64[ns]
>>> pd.Series('13/7/21').astype('datetime64')
0 2021-07-13
dtype: datetime64[ns]
>>> pd.Series('12/7/21').astype('datetime64')
0 2021-12-07
dtype: datetime64[ns]
解决这个问题的方法只是将字符串的Series
传递给pd.to_datetime
,而不是中间转换为datetime64
s。因此,您可以简单地执行
pd.to_datetime(df['Date'], format='%d/%m/%y')
没有.astype
铸造