учитывая 2 временных ряда, создайте столбец и вперёд заполните несколько дат - PullRequest
0 голосов
/ 25 октября 2018

Здравствуйте, у меня есть 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 заполнение должно переключиться на следующую дату из второго временного ряда, т. е. 01.09.2017.

Я считаю, что это должен быть какой-то тип ffill или resample, но я не могу придумать, как реализовать это!

Любое предложение высоко ценится!Спасибо!

1 Ответ

0 голосов
/ 25 октября 2018

Я полагаю, вам нужно сначала преобразовать их 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
...