我从一个数据帧开始如下:
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
。
当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
。答案 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]