熊猫:在特定时间窗口中选择行

Han*_*ick 4 python datetime pandas

我有一个涵盖多个天的样本数据集,所有样本都带有时间戳。我想选择特定时间范围内的行。例如,每天下午1点到3点之间生成的所有行。

这是我在pandas数据框中的数据示例:

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   
Run Code Online (Sandbox Code Playgroud)

我该如何实现?我需要忽略日期,而只是评估时间部分。我可以循环遍历数据框并以这种方式评估日期时间,但是必须有更简单的方法来做到这一点。

我将通过字符串读取的messageDate转换为dateTime

df["messageDate"]=pd.to_datetime(df["messageDate"])
Run Code Online (Sandbox Code Playgroud)

但是在那之后,我陷入了仅按时过滤的问题。

任何输入表示赞赏。

Gri*_*kin 7

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
Run Code Online (Sandbox Code Playgroud)