2014-01-30 4 views
0

У меня есть простой Pandas DataFrame, содержащий столбцы 'valid_time' и 'value'. Частота выборки составляет примерно ежечасно, но нерегулярно и с некоторыми большими пробелами. Я хочу иметь возможность эффективно вытащить все строки за данный день (т. Е. В течение календарного дня). Как это сделать, используя DataFrame.where() или что-то еще?Как найти все строки с определенной датой с помощью Pandas?

я наивно хочу сделать что-то вроде этого (что, очевидно, не работает):

dt = datetime.datetime(<someday>) 
rows = data.where(data['valid_time'].year == dt.year and 
        data['valid_time'].day == dt.day and 
        data['valid_time'].month == dt.month) 

Там, по крайней мере, несколько проблем, с выше кодом. Я новичок в пандах, так что я воодушевляюсь тем, что, вероятно, просто.

ответ

2

Панда абсолютно потрясающая для подобных вещей. Я бы порекомендовал сделать ваше поле datetime вашим индексом, как можно видеть here. Если вы дадите немного больше информации о структуре вашего фрейма данных, я с удовольствием включу более подробные указания.

Затем вы можете легко захватить все строки с даты, используя df['1-12-2014'], который будет захватывать все с 12 января 2014 года. Вы можете отредактировать это, чтобы получить все с января, используя df[1-2014]. Если вы хотите, чтобы захватить данные из диапазона дат и/или времени, вы можете сделать что-то вроде:

df['1-2014':'2-2014'] 

панды является довольно мощным, особенно для временных данных индексированных.

+0

Спасибо. Мой dataframe был сделан просто путем преобразования двумерного массива numpy, поскольку мне не удалось разработать синтаксис для создания «пустого» DataFrame, который я заполнил необходимой информацией. Я знаком с numpy, так что это казалось самым быстрым решением. Я посмотрю, как установить поле времени как индекс, хотя, поскольку эта функциональность, которую вы демонстрируете, выглядит точно так, как мне нужно для этого проекта. – Bogdanovist

+0

Из чего генерируется ваш 2D-массив? Читайте в файле? Вытащил из БД? Расчеты? –

+0

Вычисления (в основном), теперь я инициализирую это следующим образом: (например) hourly_pred = pd.DataFrame ({'T': np.zeros (len (fpred)), 'W': np.zeros (len (fpred))}, index = fpred.index) – Bogdanovist

0

Попробуйте это (так же, как продолжение вашей идеи):

import pandas as pd 
import numpy.random as rd 
import datetime 

times = pd.date_range('2014/01/01','2014/01/6',freq='H') 
values = rd.random_integers(0,10,times.size) 

data = pd.DataFrame({'valid_time':times, 'values': values}) 
dt = datetime.datetime(2014,1,3) 
rows = data['valid_time'].apply(
    lambda x: x.year == dt.year and x.month==dt.month and x.day== dt.day 
    ) 

print data[rows] 
Смежные вопросы