熊猫datetime:找到datetime之后第一个日期的正确年份

时间:2018-06-25 15:07:28

标签: python python-3.x pandas datetime dataframe

我从一个数据帧开始如下:

In [24]: df = pd.DataFrame(
    ...:     {'date1': ['10/02/2012', '10/02/2012', 'NA/NA/2014', 'NA/NA/2014', '01/02/2014'],
    ...:     'date2': ['10-Nov', '19-Oct', '26-Nov', '23-Oct', '14-Oct'],
    ...:     'date3': ['30/06/2011', '30/06/2011', '30/06/2013', '30/06/2013', 'NA']})
    ...:

In [25]: df
Out[25]:
        date1   date2       date3
0  10/02/2012  10-Nov  30/06/2011
1  10/02/2012  19-Oct  30/06/2011
2  NA/NA/2014  26-Nov  30/06/2013
3  NA/NA/2014  23-Oct  30/06/2013
4  01/02/2014  14-Oct  NA

我设法将日期转换为datetime对象。因此,我有以下数据框:

In [26]: df["date1"] = pd.to_datetime(df["date1"], errors="coerce", dayfirst=True, infer_datetime_format=True)
    ...: df["date3"] = pd.to_datetime(df["date3"], errors="coerce", dayfirst=True, infer_datetime_format=True)
    ...: df["date2"] = pd.to_datetime(df["date2"], errors="coerce", dayfirst=True, format="%d-%b")
    ...: df
    ...:
Out[26]:
       date1      date2      date3
0 2012-02-10 1900-11-10 2011-06-30
1 2012-02-10 1900-10-19 2011-06-30
2        NaT 1900-11-26 2013-06-30
3        NaT 1900-10-23 2013-06-30
4 2014-01-02 1900-10-14        NaT

由于date2没有year编码,因此将所有year的值都设置为1900

但是,我需要date2之后到达的date3中的第一个日期,以及与此日期时间相关联的year

另请注意:

date3NaT时,我需要从date1向后看以填写date2的年份。可以在df.iloc[4,:]

中看到

所以我希望输出日期框架为:

       date1      date2      date3
0 2012-02-10 2011-11-10 2011-06-30
1 2012-02-10 2011-10-19 2011-06-30
2        NaT 2013-11-26 2013-06-30
3        NaT 2013-10-23 2013-06-30
4 2014-01-02 2013-10-14        NaT

这比仅使用date3.year更加困难,因为有时date3是一年中的下半年(例如30/12/2013-> 2013-12-30),因此date2将是明年的第一个日期(即14-Oct-> 1900-10-14-> 2014-10-14)。

此外,当返回nan时,我需要使日期时间足够强大以返回NaT。

所以我需要在year之后找到与date3中的day-month相匹配的下一个date2。或者,如果缺少该字段,我需要在year之前与date1中的day-month相匹配的date2

1 个答案:

答案 0 :(得分:1)

您可以对日期2和日期3进行m-d比较

pd.to_datetime(((df.date2.dt.strftime('%m%d')<df.date3.dt.strftime('%m%d')).astype(int)+df.date3.dt.year).astype(str)+'-'+df.date2.dt.strftime('%m-%d'))
Out[62]: 
0   2011-11-10
1   2011-10-19
2   2013-11-26
3   2013-10-23
4   2013-10-14
dtype: datetime64[ns]