Python – получение данных за последние 30 дней из панд кадра данных

У меня есть датафрейм, содержащий журналы ошибок за шесть месяцев, которые собираются каждый день. Я хочу получить записи за последние 30 дней с последней даты. Последняя дата не сегодня.
Например: у меня есть данные за май, июнь, июль и до August 15, я хочу получить эти данные с August 15 по July 15, чтобы получить записи за 30 дней.
Есть ли данные? способ сделать это в Python Pandas?

Это пример кадра данных:

Error_Description         Date        Weekend      Type
N17739 Limit switch X-    5/1/2015    5/3/2015    Critical
N17739 Limit switch Y-    5/1/2015    5/3/2015    Critical
N938 Key non-functional   5/1/2015    5/3/2015    Non-Critical
P124 Magazine is running  5/1/2015    5/3/2015    Non-Critical
N17738 Limit switch Z+    5/1/2015    5/3/2015    Critical
N938 Key non-functional   5/1/2015    5/3/2015    Non-Critical
     ...                    ...         ...          ...
P873 ENCLOSURE DOOR       8/24/2015   8/30/2015   Non-Critical
N3065 Reset M114          8/24/2015   8/30/2015   Non-Critical
N3065 Reset M114,         8/24/2015   8/30/2015   Non-Critical
N2853 Synchronization     8/24/2015   8/30/2015   Critical
P152 ENCLOSURE            8/24/2015   8/30/2015   Non-Critical
N6236 has stopped         8/24/2015   8/30/2015   Critical

person Naive Babes    schedule 23.11.2015    source источник
comment
Вы можете просто нарезать df df.iloc[::30] нет?   -  person EdChum    schedule 23.11.2015
comment
@EdChum, наверное, ты имеешь в виду df.iloc[-30:]?   -  person Anton Protopopov    schedule 23.11.2015
comment
@AntonProtopopov op хочет сгенерировать 30-дневные блоки, так что это зависит от того, `df.iloc[-30:] принимает только последние 30 записей   -  person EdChum    schedule 23.11.2015
comment
Он дает мне каждое 30-е значение из кадра данных, начиная с 0. Кроме того, в день фиксируется не менее 1 тыс. сообщений об ошибках.   -  person Naive Babes    schedule 23.11.2015
comment
@AntonProtopopov - на выходе были последние 30 записей, а меня интересуют данные за последние 30 дней. Как я уже говорил, за один день делается несколько записей.   -  person Naive Babes    schedule 23.11.2015
comment
@EdChum - он дает мне каждое 30-е значение из кадра данных, начиная с 0. Кроме того, в день фиксируется не менее 1 тыс. сообщений об ошибках.   -  person Naive Babes    schedule 23.11.2015
comment
Не могли бы вы прикрепить часть вашего фрейма данных?   -  person Anton Protopopov    schedule 23.11.2015


Ответы (3)


Дата lastdayfrom используется для выбора последних 30 дней DataFrame функцией место.

lastdayfrom = pd.to_datetime('8/24/2015')
print lastdayfrom
#2015-08-24 00:00:00

print df
#           Error_Description       Date    Weekend          Type
#0     N17739 Limit switch X- 2015-05-01 2015-05-03      Critical
#1     N17739 Limit switch Y- 2015-05-01 2015-05-03      Critical
#2    N938 Key non-functional 2015-05-01 2015-05-03  Non-Critical
#3   P124 Magazine is running 2015-05-01 2015-05-03  Non-Critical
#4     N17738 Limit switch Z+ 2015-02-01 2015-05-03      Critical
#5    N938 Key non-functional 2015-07-25 2015-05-03  Non-Critical
#6        P873 ENCLOSURE DOOR 2015-07-24 2015-08-30  Non-Critical
#7           N3065 Reset M114 2015-07-21 2015-08-21  Non-Critical
#8          N3065 Reset M114, 2015-08-22 2015-08-22  Non-Critical
#9      N2853 Synchronization 2015-08-23 2015-08-30      Critical
#10            P152 ENCLOSURE 2015-08-24 2015-08-30  Non-Critical
#11         N6236 has stopped 2015-08-24 2015-08-30      Critical

print df.dtypes
#Error_Description            object
#Date                 datetime64[ns]
#Weekend              datetime64[ns]
#Type                         object
#dtype: object

#set index from column Date
df = df.set_index('Date')
#if datetimeindex isn't order, order it
df= df.sort_index()

#last 30 days of date lastday
df = df.loc[lastdayfrom - pd.Timedelta(days=30):lastdayfrom].reset_index()
print df
#        Date      Error_Description    Weekend          Type
#0 2015-07-25       N3065 Reset M114 2015-08-21  Non-Critical
#1 2015-08-22      N3065 Reset M114, 2015-08-22  Non-Critical
#2 2015-08-23  N2853 Synchronization 2015-08-30      Critical
#3 2015-08-24         P152 ENCLOSURE 2015-08-30  Non-Critical
#4 2015-08-24      N6236 has stopped 2015-08-30      Critical
person jezrael    schedule 23.11.2015

Вы можете использовать DataFrame.last_valid_index(), чтобы найти метку последней строки, а затем вычесть DateOffset(30, 'D'), чтобы вернуться на 30 дней назад:

df[df.last_valid_index()-pandas.DateOffset(30, 'D'):]
person faltarell    schedule 23.11.2015
comment
(при условии, что индекс является DatetimeIndex...) - person faltarell; 23.11.2015
comment
Непонятно, какой индекс в вашем примере, но чтобы использовать решение, которое я предложил выше, вам нужно установить дату столбца как индекс: df2 = df.reset_index().set_index('Date') - person faltarell; 23.11.2015

Два других ответа (в настоящее время) предполагают, что дата является индексом, но, по крайней мере, в python3 вы можете решить это с помощью простой маскировки (.query(..) не работает).

df[df["Date"] >= (pd.to_datetime('8/24/2015') - pd.Timedelta(days=30))]

person Chris    schedule 07.10.2019