您好,我有2个时间序列,一个有每日日期,一个有特定日期。我创建了一个df,其行显示每日日期。我想创建一个列来填充日期,直到该行显示包含特定日期的时间序列中的日期为止。
我所拥有的:
每日时间序列
Date
13/03/2017
10/03/2017
09/03/2017
08/03/2017
....
15/02/2017
14/02/2017
13/02/2017
10/02/2017
09/02/2017
08/02/2017
07/02/2017
06/02/2017
03/02/2017
02/02/2017
01/02/2017
31/01/2017
30/01/2017
以及具有特定日期的时间序列
Date
13/03/2017
06/02/2017
09/01/2017
05/12/2016
07/11/2016
11/10/2016
06/09/2016
08/08/2016
我想得到的是以下
Start
13/03/2017 06/02/2017
10/03/2017 06/02/2017
09/03/2017 06/02/2017
08/03/2017 06/02/2017
....
15/02/2017 06/02/2017
14/02/2017 06/02/2017
13/02/2017 06/02/2017
10/02/2017 06/02/2017
09/02/2017 06/02/2017
08/02/2017 06/02/2017
07/02/2017 06/02/2017
06/02/2017 06/02/2017
03/02/2017 09/01/2017
02/02/2017 09/01/2017
01/02/2017 09/01/2017
31/01/2017 09/01/2017
30/01/2017 09/01/2017
02/02/2017 09/01/2017
01/02/2017 09/01/2017
31/01/2017 09/01/2017
30/01/2017 09/01/2017
基本上,在06/02/2017仍然应该给我06/02/2017,但在05/02/2017,填充应切换到第二个时间序列中的下一个日期,即09/01/2017。
我认为这应该是某种填充或重新采样,但是我想不出实现此目的的方法!
任何建议都值得赞赏! 谢谢!
答案 0 :(得分:0)
我相信您首先需要将它们转换为to_datetime
,然后通过isin
找到相同的值,并以where
替换,最后回填缺失的值:
#s1, and s2 are Series
df1 = pd.to_datetime(s1, format='%d/%m/%Y').to_frame('date')
s = pd.to_datetime(s2, format='%d/%m/%Y')
#s1, and s2 are columns Date
#df1 = pd.to_datetime(df1['Date'], format='%d/%m/%Y').to_frame('date')
#s = pd.to_datetime(df2['Date'], format='%d/%m/%Y')
df1['Start'] = df1['date'].where(df1['date'].isin(s)).bfill()
另一种解决方案:
df1.loc[df1['date'].isin(s), 'Start'] = df1['date']
df1['Start'] = df1['Start'].bfill()
print (df1)
date Start
0 2017-03-13 2017-03-13
1 2017-03-10 2017-02-06
2 2017-03-09 2017-02-06
3 2017-03-08 2017-02-06
4 2017-02-15 2017-02-06
5 2017-02-14 2017-02-06
6 2017-02-13 2017-02-06
7 2017-02-10 2017-02-06
8 2017-02-09 2017-02-06
9 2017-02-08 2017-02-06
10 2017-02-07 2017-02-06
11 2017-02-06 2017-02-06
12 2017-02-03 NaT
13 2017-02-02 NaT
14 2017-02-01 NaT
15 2017-01-31 NaT
16 2017-01-30 NaT
替换丢失的最后一个值有点复杂,因为第二个Series
中可能不存在下一个值:
next_val = next(iter(s[(s == df1['Start'].min()).shift().fillna(False)]), np.nan)
df1['Start'] = df1['Start'].fillna(next_val)
print (df1)
date Start
0 2017-03-13 2017-03-13
1 2017-03-10 2017-02-06
2 2017-03-09 2017-02-06
3 2017-03-08 2017-02-06
4 2017-02-15 2017-02-06
5 2017-02-14 2017-02-06
6 2017-02-13 2017-02-06
7 2017-02-10 2017-02-06
8 2017-02-09 2017-02-06
9 2017-02-08 2017-02-06
10 2017-02-07 2017-02-06
11 2017-02-06 2017-02-06
12 2017-02-03 2017-01-09
13 2017-02-02 2017-01-09
14 2017-02-01 2017-01-09
15 2017-01-31 2017-01-09
16 2017-01-30 2017-01-09