Получить следующую доступную дату в фильтре Панды по дням
Я отфильтровал datetime64[ns]
введите pandas dataframe, чтобы получить данные, приходящиеся на определенную дату каждого месяца, используя следующую строку кода.
df[df['Date'].map(lambda x: x.day) == 1]
Вывод следующий:
19.9 2013-07-01
34.8 2013-08-01
12.9 2013-10-01
12.6 2013-11-01
Но если вы заметили запись для 2013-09-01
отсутствует, так как он недоступен в исходном наборе данных. В такой ситуации я хочу получить данные для 2013-09-02
, В идеале, если дата выпадает на выходные (суббота и воскресенье или любая пропущенная дата, например, праздники или данные, недоступные на определенную дату), я хочу получить данные на следующую доступную дату. Интересно, сможем ли мы достичь с помощью панд или мне нужно вручную выполнить эту функцию.
2 ответа
Я думаю тебе нужно DatetimeIndex
с asfreq
а также method='bfill'
для повторного заполнения пропущенных значений:
df = df.set_index('Date').asfreq('d', method='bfill')
Затем отфильтруйте DatetimeIndex.day
:
df1 = df[df.index.day == 1]
Образец:
print (df)
Val Date
0 19.9 2013-07-01
1 34.8 2013-08-01
2 10.4 2013-09-02
3 12.9 2013-10-01
4 12.6 2013-11-01
print (df.dtypes)
Val float64
Date datetime64[ns]
df = df.set_index('Date').asfreq('d', method='bfill')
df1 = df[df.index.day == 1]
print (df1)
Val
Date
2013-07-01 19.9
2013-08-01 34.8
2013-09-01 10.4
2013-10-01 12.9
2013-11-01 12.6
Вы также можете сделать это, установив дату в качестве индекса и выполнив поиск следующей существующей даты в первый день каждого месяца, используя index.get_loc() и установив метод равным bfill:
print(df)
Val
Date
2013-07-01 19.9
2013-08-01 34.8
2013-08-02 34.8
2013-09-02 10.4
2013-10-01 12.9
2013-11-01 12.6
df = df.set_index('Date')
df.iloc[[df.index.get_loc(datetime.datetime(date[0],date[1],1),
method='bfill') for date,_ in df.groupby(
[df.index.year,df.index.month])]]
Val
Date
2013-07-01 19.9
2013-08-01 34.8
2013-09-02 10.4
2013-10-01 12.9
2013-11-01 12.6