解析pandas多种日期格式

alm*_*lmo 2 python date pandas

我一直坚持以下格式:

0   2001-12-25  
1   2002-9-27   
2   2001-2-24   
3   2001-5-3    
4   200510
5   20078
Run Code Online (Sandbox Code Playgroud)

我需要的是格式为 %Y-%m 的日期

我尝试的是

 def parse(date):
     if len(date)<=5:
         return "{}-{}".format(date[:4], date[4:5], date[5:])
     else:
         pass

  df['Date']= parse(df['Date'])
Run Code Online (Sandbox Code Playgroud)

但是,我只成功解析了20078到2007-8,像2001-12-25这样的格式显示为None。那么,我该怎么做呢?谢谢你!

Dat*_*ice 6

我们可以使用pd.to_datetime和 useerrors='coerce'来逐步解析日期。

假设您的专栏被称为date

s = pd.to_datetime(df['date'],errors='coerce',format='%Y-%m-%d')

s = s.fillna(pd.to_datetime(df['date'],format='%Y%m',errors='coerce'))

df['date_fixed'] = s

print(df)

         date date_fixed
0  2001-12-25 2001-12-25
1   2002-9-27 2002-09-27
2   2001-2-24 2001-02-24
3    2001-5-3 2001-05-03
4      200510 2005-10-01
5       20078 2007-08-01
Run Code Online (Sandbox Code Playgroud)

按步骤,

首先,我们将常规日期时间转换为一个名为的新系列s

s = pd.to_datetime(df['date'],errors='coerce',format='%Y-%m-%d')

print(s)

0   2001-12-25
1   2002-09-27
2   2001-02-24
3   2001-05-03
4          NaT
5          NaT
Name: date, dtype: datetime64[ns]
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,NaT我们的系列中有两个为空日期时间值,它们与您缺少一天的日期时间相对应,

然后我们重新应用相同的datetime方法但使用相反的格式,并将它们应用于缺失值s

s = s.fillna(pd.to_datetime(df['date'],format='%Y%m',errors='coerce'))

print(s)


0   2001-12-25
1   2002-09-27
2   2001-02-24
3   2001-05-03
4   2005-10-01
5   2007-08-01
Run Code Online (Sandbox Code Playgroud)

然后我们重新分配给您的数据框。