2015-07-14 1 views
1

Я тяну кусок данных в пределах диапазона времени. Он вытаскивает дату и время из столбца recvd_dttm. Он берет все данные, начиная с года назад. Я хочу изменить его так, чтобы он мог вытащить месяц или день, но pd.DateOffset (months = 1) дает ошибку KeyError:1. Я получаю ту же ошибку, если меняю ее на days = 7. Но он отлично работает с годами = 1. Что здесь происходит?DateOffset от года к месяцу и неделе

df = pd.read_csv('MYDATA.csv') 

# filter by countries with at least one medal and sort 
df['recvd_dttm'] = pd.to_datetime(df['recvd_dttm']) 

#Only retrieve data before now (ignore typos that are future dates) 
mask = df['recvd_dttm'] <= datetime.datetime.now() 
df = df.loc[mask] 
# get first and last datetime for final week of data 

range_max = df['recvd_dttm'].max() 
range_min = range_max - pd.DateOffset(years=1) 

# take slice with final week of data 
df = df[(df['recvd_dttm'] >= range_min) & 
       (df['recvd_dttm'] <= range_max)] 

EDIT: проблема исходила из других частей кода!

+0

Вы можете уточнить, какова ваша конечная цель? это получить максимальные значения за каждый год? – AZhao

+0

Нет. Конечная цель состоит в том, чтобы иметь фрагмент данных определенного диапазона, который вводит пользователь. Они выбирают день, месяц, год, и он извлекает этот объем данных из csv. – jenryb

+0

как насчет линий range_max и range_min? что вы надеетесь, что они пытаются добиться успеха? это только начало и остановка выбранного диапазона? – AZhao

ответ

1

Вы пытались быть более четко с тем, что pd.DateOffset действует на?

Например:

range_max = df['recvd_dttm'].max() 
range_min = range_max - (df['recvd_dttm']+pd.DateOffset(years=1)) 

Затем заменяющие месяц и дни значения.

+0

Дело в том, что pd.DateOffset (years = 1) работает нормально. Замена месяцев и дней вызывает ошибки. Используя ваше предложение, я получил ошибку TypeError: не могу использовать не абсолютную DateOffset в операциях datetime/timedelta [] Является ли мой синтаксис неправильным? – jenryb

+0

hm можете ли вы предоставить один ряд данных для меня? – AZhao

+0

У меня есть столбец для примера. Надеюсь, это поможет! – jenryb

0

Попробуйте использовать timedelta вместо DateOffset

+0

Я должен был написать это как нечто, что я пробовал. Я не хочу делать timedelta (дни = 30) или что-нибудь в течение месяца, потому что это неточно в течение нескольких месяцев. Если я попробую месяцы = 1, я получаю TypeError: «months» является недопустимым аргументом ключевого слова для этой функции. То же самое в течение лет = 1 – jenryb

0

Считаете ли вы использование Unix Epoch Time вместо даты, отформатированной в меньшей степени? Существует хорошо документированный answer for converting to Unix Time, и рассмотрение такого рода смещения в вопросе кажется, что было бы намного проще, так как скользящие диапазоны проще реализовать с более или менее непрерывной последовательностью действительных числовых значений.

1

Семейство смещений можно использовать с pd.tseries.offsets. Ниже приведен пример кода.

import pandas as pd 
import datetime 

# your data 
# ================================ 
df = pd.read_csv('/home/Jian/Downloads/MOCK_DATA.csv', usecols=[1, 4]) 

df['recvd_dttm'] = pd.to_datetime(df['recvd_dttm']) 
mask = df['recvd_dttm'] <= datetime.datetime.now() 
df = df.loc[mask] 


# flexible offsets 
# ======================================= 
print(range_max) 

2015-07-14 16:52:58 

# for 1 month: currently there is a bug 
# range_min_month = range_max - pd.tseries.offsets.MonthOffset(1) 

# for 1 week 
range_min_week = range_max - pd.tseries.offsets.Week(1) 
print(range_min_week) 

2015-07-07 16:52:58 

# for 5 days 
range_min_day = range_max - pd.tseries.offsets.Day(5) 
print(range_min_day) 

2015-07-09 16:52:58 
+0

Thank вы Jianxun! Я действительно понял, что этот вопрос был довольно глупым, поскольку проблема была в другом месте кода. – jenryb