给定2个时间序列,创建一列并向前填充一些日期

时间:2018-10-25 13:20:18

标签: python pandas dataframe time-series fill

您好,我有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。

我认为这应该是某种填充或重新采样,但是我想不出实现此目的的方法!

任何建议都值得赞赏! 谢谢!

1 个答案:

答案 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