如何将不同格式的字符串(YYYY-MM-DD,DD-MM-YYYY)转换为pandas中一种格式的日期对象?

sag*_*van 1 python date pandas

我有一列字符串对象,其中包含不同的格式(YYYY-MM-DD,DD-MM-YYYY)。如何转换为日期对象的 DD-MM-YYYY。

我尝试过, df['accepted_date'] = pd.to_datetime(df['accepted_date'], format='%d-%m-%Y')

我收到错误,因为时间数据“1899-12-31”与格式“%d-%m-%Y”(匹配)不匹配

谢谢,

jez*_*ael 6

让 pandas 解析日期,但是应该交换一些日期和月份:

df['accepted_date'] = pd.to_datetime(df['accepted_date'])
Run Code Online (Sandbox Code Playgroud)

to_datetime因此,更好的是与 format 和参数一起使用errors='coerce',对于不匹配的情况,仅返回匹配的日期时间NaT。最后一次用于combine_firstjoin all Series-NaT被另一个值替换Series

df = pd.DataFrame({'accepted_date':['2017-01-02','07-08-2017','20-03-2017','2017-01-04']})

d1 = pd.to_datetime(df['accepted_date'], format='%d-%m-%Y', errors='coerce')
d2 = pd.to_datetime(df['accepted_date'], format='%Y-%m-%d', errors='coerce')

df['accepted_date1'] = d1.combine_first(d2)
df['accepted_date2'] = pd.to_datetime(df['accepted_date'])
print (df)
  accepted_date accepted_date1 accepted_date2
0    2017-01-02     2017-01-02     2017-01-02
1    07-08-2017     2017-08-07     2017-07-08 <-swapped dd-mm
2    20-03-2017     2017-03-20     2017-03-20
3    2017-01-04     2017-01-04     2017-01-04
Run Code Online (Sandbox Code Playgroud)

细节

print (d1)
0          NaT
1   2017-08-07
2   2017-03-20
3          NaT
Name: accepted_date, dtype: datetime64[ns]

print (d2)
0   2017-01-02
1          NaT
2          NaT
3   2017-01-04
Name: accepted_date, dtype: datetime64[ns]
Run Code Online (Sandbox Code Playgroud)

编辑:

另一个解决方案是使用参数dayfirst=True

df['accepted_date3'] = pd.to_datetime(df['accepted_date'], dayfirst=True)
print (df)
  accepted_date accepted_date3
0    2017-01-02     2017-01-02
1    07-08-2017     2017-08-07
2    20-03-2017     2017-03-20
3    2017-01-04     2017-01-04
Run Code Online (Sandbox Code Playgroud)