Панды: выбор строк в определенном временном окне - PullRequest
0 голосов
/ 09 мая 2018

У меня есть набор данных образцов за несколько дней, все с отметкой времени. Я хочу выбрать строки в определенном временном окне. Например. все строки, которые генерировались между 13:00 и 15:00 каждый день.

Это образец моих данных в кадре данных панд:

22           22  2018-04-12T20:14:23Z  2018-04-12T21:14:23Z      0  6370.1   
23           23  2018-04-12T21:14:23Z  2018-04-12T21:14:23Z      0  6368.8   
24           24  2018-04-12T22:14:22Z  2018-04-13T01:14:23Z      0  6367.4   
25           25  2018-04-12T23:14:22Z  2018-04-13T01:14:23Z      0  6365.8   
26           26  2018-04-13T00:14:22Z  2018-04-13T01:14:23Z      0  6364.4   
27           27  2018-04-13T01:14:22Z  2018-04-13T01:14:23Z      0  6362.7   
28           28  2018-04-13T02:14:22Z  2018-04-13T05:14:22Z      0  6361.0   
29           29  2018-04-13T03:14:22Z  2018-04-13T05:14:22Z      0  6359.3   
..          ...                   ...                   ...    ...     ...   
562         562  2018-05-05T08:13:21Z  2018-05-05T09:13:21Z      0  6300.9   
563         563  2018-05-05T09:13:21Z  2018-05-05T09:13:21Z      0  6300.7   
564         564  2018-05-05T10:13:14Z  2018-05-05T13:13:14Z      0  6300.2   
565         565  2018-05-05T11:13:14Z  2018-05-05T13:13:14Z      0  6299.9   
566         566  2018-05-05T12:13:14Z  2018-05-05T13:13:14Z      0  6299.6   

Как мне этого добиться? Мне нужно игнорировать дату и просто оценить компонент времени. Я мог бы пройтись по циклу данных и оценить дату и время таким образом, но должен быть более простой способ сделать это ..

Я конвертировал messageDate, которое считывало строку, в dateTime на

df["messageDate"]=pd.to_datetime(df["messageDate"])

Но после этого я застрял в том, как фильтровать только по времени.

Любой вклад приветствуется.

Ответы [ 4 ]

0 голосов
/ 09 мая 2018

попробуйте это, убедившись, что messageDate действительно является форматом даты и времени, как вы сделали

df.set_index('messageDate',inplace=True)
choseInd = [ind for ind in df.index if (ind.hour>=13)&(ind.hour<=15)]
df_select = df.loc[choseInd]

вы можете сделать то же самое, даже не указав в качестве индекса столбец datetime, как ответ с apply: lambda показывает

это просто делает ваш фрейм данных «лучше выглядящим», если datetime - ваш индекс, а не числовой.

0 голосов
/ 09 мая 2018

datetime столбцы имеют DatetimeProperties объект, из которого вы можете извлечь datetime.time и отфильтровать его:

import datetime

df = pd.DataFrame(
    [
        '2018-04-12T12:00:00Z', '2018-04-12T14:00:00Z','2018-04-12T20:00:00Z',
        '2018-04-13T12:00:00Z', '2018-04-13T14:00:00Z', '2018-04-13T20:00:00Z'
    ], 
    columns=['messageDate']
)
df
            messageDate
# 0 2018-04-12 12:00:00
# 1 2018-04-12 14:00:00
# 2 2018-04-12 20:00:00
# 3 2018-04-13 12:00:00
# 4 2018-04-13 14:00:00
# 5 2018-04-13 20:00:00

df["messageDate"] = pd.to_datetime(df["messageDate"])
time_mask = (df['messageDate'].dt.hour >= 13) & \
            (df['messageDate'].dt.hour <= 15)

df[time_mask]
#           messageDate
# 1 2018-04-12 14:00:00
# 4 2018-04-13 14:00:00
0 голосов
/ 09 мая 2018
df=df[(df["messageDate"].apply(lambda x : x.hour)>13) & (df["messageDate"].apply(lambda x : x.hour)<15)]

Вы можете использовать x.minute, x.second аналогично.

0 голосов
/ 09 мая 2018

Надеюсь, код говорит сам за себя. Вы всегда можете задать вопросы.

import pandas as pd

#   Prepping data for example
dates = pd.date_range('1/1/2018', periods=7, freq='H')
data = {'A' : range(7)}
df = pd.DataFrame(index = dates, data = data)
print df
#                      A
# 2018-01-01 00:00:00  0
# 2018-01-01 01:00:00  1
# 2018-01-01 02:00:00  2
# 2018-01-01 03:00:00  3
# 2018-01-01 04:00:00  4
# 2018-01-01 05:00:00  5
# 2018-01-01 06:00:00  6

#   Creating a mask to filter the value we with to have or not.
#   Here, we use df.index because the index is our datetime.
#   If the datetime is a column, you can always say df['column_name']
mask = (df.index > '2018-1-1 01:00:00') & (df.index < '2018-1-1 05:00:00')
print mask
# [False False  True  True  True False False]

df_with_good_dates = df.loc[mask]
print df_with_good_dates
#                      A
# 2018-01-01 02:00:00  2
# 2018-01-01 03:00:00  3
# 2018-01-01 04:00:00  4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...