Получить следующую доступную дату в фильтре Панды по дням

Я отфильтровал 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
Другие вопросы по тегам