解析多个日期格式的熊猫

时间:2020-06-05 08:50:44

标签: python pandas date

我受制于以下格式:

0   2001-12-25  
1   2002-9-27   
2   2001-2-24   
3   2001-5-3    
4   200510
5   20078

我需要的是%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'])

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

2 个答案:

答案 0 :(得分:1)

我们可以使用pd.to_datetimeerrors='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

逐步

首先,我们将常规日期时间转换为一个名为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]

如您所见,我们有两个NaT,它们是我们系列中的空datetime值,它们对应于您缺少一天的datetime,

然后,我们重新应用相同的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

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

答案 1 :(得分:0)

您可以使用正则表达式提取年份和月份,并转换为日期时间:

df = pd.read_clipboard("\s{2,}",header=None,names=["Dates"])

pattern = r"(?P<Year>\d{4})[-]*(?P<Month>\d{1,2})"

df['Dates'] = pd.to_datetime([f"{year}-{month}" for year, month in df.Dates.str.extract(pattern).to_numpy()])

print(df)

        Dates
0   2001-12-01
1   2002-09-01
2   2001-02-01
3   2001-05-01
4   2005-10-01
5   2007-08-01

请注意,由于只提供了年份和月份,因此熊猫自动将日期转换为1。