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。
另一种方法是使用映射器并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)
由于您有两种类型的日期时间...
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)
| 归档时间: |
|
| 查看次数: |
326 次 |
| 最近记录: |