Получить следующую доступную дату в фильтре Панды по дням - PullRequest
0 голосов
/ 12 ноября 2018

Я отфильтровал тип datetime64[ns] в кадре данных pandas, чтобы получить данные, приходящиеся на определенную дату каждого месяца, используя следующую строку кода.

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 ]

0 голосов
/ 12 ноября 2018

Вы также можете сделать это, установив дату в качестве индекса и выполнив поиск следующей существующей даты в первый день каждого месяца, используя 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
0 голосов
/ 12 ноября 2018

Я думаю, вам нужно DatetimeIndex с asfreq и method='bfill' для повторного заполнения пропущенных значений:

df = df.set_index('Date').asfreq('d', method='bfill')

Затем отфильтруйте по DatetimeIndex.day:

df1 = df[df.index.day == 1]

Sample

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
...