使用pd.to_datetime处理多个日期时间格式

yuc*_*ang 2 python datetime date pandas

我有一个数据时间数据,它们的格式就像2906201701AUG2017.如您所见,月份处于数据中间.

我希望在使用时将此数据转换为datetime pd.to_datetime,但它不起作用.

你知道解决这个问题的好方法吗?

And*_*den 12

您可以使用pd.to_datetime's 格式参数:

In [11]: s = pd.Series(["29062017", "01AUG2017"])

In [12]: pd.to_datetime(s, format="%d%m%Y", errors="coerce")
Out[12]:
0   2017-06-29
1          NaT
dtype: datetime64[ns]

In [13]: pd.to_datetime(s, format="%d%b%Y", errors="coerce")
Out[13]:
0          NaT
1   2017-08-01
dtype: datetime64[ns]
Run Code Online (Sandbox Code Playgroud)

注意:coerce参数意味着失败将是NaT

并将NaNs 从一个填入另一个,例如使用fillna

In [14]: pd.to_datetime(s, format="%d%m%Y", errors="coerce").fillna(pd.to_datetime(s, format="%d%b%Y", errors="coerce"))
Out[14]:
0   2017-06-29
1   2017-08-01
dtype: datetime64[ns]
Run Code Online (Sandbox Code Playgroud)

任何与任一格式都不匹配的字符串将保持 NaT。


cs9*_*s95 5

另一种方法是使用映射器并replace用等效的数字替换月份代码:

s = pd.Series(["29062017", "01AUG2017"]); s

0     29062017
1    01AUG2017
dtype: object

m = {'JAN' : '01', ..., 'AUG' : '08', ...}  # you fill in the rest

s = s.replace(m, regex=True); s

0    29062017
1    01082017
dtype: object
Run Code Online (Sandbox Code Playgroud)

现在您只需要一个pd.to_datetime电话:

pd.to_datetime(s, format="%d%m%Y", errors="coerce")

0   2017-06-29
1   2017-08-01
dtype: datetime64[ns]
Run Code Online (Sandbox Code Playgroud)


WeN*_*Ben 5

由于您有两种类型的日期时间...

s.apply(lambda x : pd.to_datetime(x, format="%d%m%Y") if x.isdigit() else pd.to_datetime(x, format="%d%b%Y"))

Out[360]: 
0   2017-06-29
1   2017-08-01
dtype: datetime64[ns]
Run Code Online (Sandbox Code Playgroud)