【问题标题】:Pandas datetime: find the correct year for the first date after a datetimePandas datetime:找到日期时间后第一个日期的正确年份
【发布时间】:2018-06-25 15:07:27
【问题描述】:

我从如下数据框开始:

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

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

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

但是,我需要在date3 之后到达date2 中的第一个日期,并且此日期时间与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 将是明年的第一个日期(即@ 987654341@ -> 1900-10-14 -> 2014-10-14)。

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以应用 m-d 与 date2 和 date3 进行比较

    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]
    

    【讨论】:

    • 这里的问题是我在 date2 列中有一些 NaT。因此,df.date3.dt.year 返回dtype == float 的对象。因此,在传入pd.to_datetime() 之前返回的字符串是"2011.0-11-10"。该系列看起来像这样pd.Series(["2011.0-11-10", "2011.0-10-19", "2013.0-11-26", "2013.0-10-23", "2013.0-10-14"])
    • @TommyLees 你可以用一些年份的链接 fillna(1970) 来填充,然后应该全部修复
    • 增加了复杂性(将更新问题以反映),因为有时date1 存在但date2 不存在。在这种情况下,我需要做相反的事情并从date1 向后看。我可以和你做同样的事情,但反过来,创建 2 个日期时间 Seriesjoin 他们,不包括 NaT
    • 非常感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多