2016-05-19 3 views
0

Я с dataframe, что я прочитал в Python с панды, который выглядит следующим образом:Python/Панды - Преобразование числа строк в час, а затем нарезка

>>> df id temp 0 1 272.53702 1 2 272.41101 2 3 272.18503 3 4 271.79102 4 5 271.33701 5 6 270.86200 6 7 270.41501 7 8 269.97501 8 9 269.56201 9 10 269.18802 ...

id поле представляет каждый час от в первый час 1989 года (полночь 1 января 1989 года) до последнего часа 2010 года. Моя цель - извлечь список из столбца temp, представляющий температуру с 1 мая 2002 года по 20 ноября 2006 года, а затем, чтобы соответствовать списку используя сплайновую интерполяцию Scipy. Мой вопрос: какой самый эффективный способ преобразования id в datetime, а затем нарезку, чтобы получить соответствующий диапазон дат, который я хочу?

Спасибо.

+0

Почему вы не просто создать 'datetime' столбец' id'? – EdChum

ответ

1

Вы можете использовать дату арифметику определить, какие id значения соответствуют даты начала и окончания вы ищете, а затем использовать loc, чтобы выбрать связанный температуры. Вероятно, это будет быстрее, чем преобразование всех значений id в даты, а затем нарезку.

start = 24*(pd.to_datetime('2002-05-01') - pd.to_datetime('1989-01-01')).days 
end = 24*(pd.to_datetime('2006-11-20') - pd.to_datetime('1989-01-01')).days - 1 
temp_values = df.loc[df['id'].between(start, end), 'temp'].values 

К «до 20 ноября 2006 года», я предполагаю, что вы имеете в виду до, но не включая 20 ноября 2006 года Если вы хотите данные через 20-го, просто использовать 21 вместо 20 при вычислении end. Я вычитаю один из end, чтобы получить последний час дня до даты в вычислении, чтобы не включать дату, используемую при вычислении.

+0

Привет, спасибо за вашу помощь. Я заметил, что длина 'temp_values' на 1 длиннее числа строк, которые у меня есть после нарезки' df' с 'df [start: end]'. Почему это? – potpie

+0

'df [start: end]' использует нотацию среза python, которая не включает 'end'. Для 'temp_values', я использую pandas' .between', который включает 'end'. Основываясь на том, как я вычислил 'end', вы хотите включить его. – root

+0

На самом деле, 'start' не был включен. Термины «end» были как нарезанных «df», так и «temp_values». Выполнение 'df [start-1: end]' соответствует 'temp_values'. – potpie

0

Вот в основном то, что вам нужно использовать:

>>> from datetime import datetime, timedelta 
>>> print datetime(1989, 1, 1) 
1989-01-01 00:00:00 
>>> print datetime(1989, 1, 1) + timedelta(hours=5) 
1989-01-01 05:00:00 
0

Я предлагаю просто добавить datetime колонку, которая позволит вам пройти datetime объекты для выбора:

In [162]: 
df['date'] = dt.datetime(1989,1,1) + pd.TimedeltaIndex(df['id'], 'h') 
df 

Out[162]: 
    id  temp    date 
0 1 272.53702 1989-01-01 01:00:00 
1 2 272.41101 1989-01-01 02:00:00 
2 3 272.18503 1989-01-01 03:00:00 
3 4 271.79102 1989-01-01 04:00:00 
4 5 271.33701 1989-01-01 05:00:00 
5 6 270.86200 1989-01-01 06:00:00 
6 7 270.41501 1989-01-01 07:00:00 
7 8 269.97501 1989-01-01 08:00:00 
8 9 269.56201 1989-01-01 09:00:00 
9 10 269.18802 1989-01-01 10:00:00 

In [163]: 
df.loc[df['date'] > '1989-01-01 06:00'] 

Out[163]: 
    id  temp    date 
6 7 270.41501 1989-01-01 07:00:00 
7 8 269.97501 1989-01-01 08:00:00 
8 9 269.56201 1989-01-01 09:00:00 
9 10 269.18802 1989-01-01 10:00:00 
Смежные вопросы