2015-11-23 2 views
5

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

Это образец dataframe:

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 
+0

Вы можете просто нарезать ДФ 'df.iloc [:: 30]' нет? – EdChum

+0

@EdChum, вероятно, вы имеете в виду 'df.iloc [-30:]'? –

+1

@AntonProtopopov op хочет сгенерировать 30-дневные блоки, так что это зависит от 'df.iloc [-30:] занимает только последние 30 записей – EdChum

ответ

4

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

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 
1

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

df[df.last_valid_index()-pandas.DateOffset(30, 'D'):] 
+0

(при условии, что индекс - это DatetimeIndex ...) – faltarell

+0

Неясно, какой индекс в вашем примере, но для использования предложенного выше решения вам нужно установить столбец Date в качестве индекса: df2 = df.reset_index () .set_index ('Date') – faltarell

Смежные вопросы