我从一个数据框开始,如下所示:
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
.
但是,我需要 date2
中的第一个日期在date3
之后达到与此日期时间关联 year
.
何时 date3
是 NaT
我需要从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
.
最佳答案
您可以应用 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]
关于python - Pandas 日期时间 : find the correct year for the first date after a datetime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51026643/