【问题标题】:Filtering pandas dataframe by day按天过滤熊猫数据框
【发布时间】:2019-04-13 13:22:15
【问题描述】:

我有一个熊猫数据框,其中包含按分钟计算的外汇数据,长达一年(371635 行):

                           O        H        L        C
0                                                      
2017-01-02 02:00:00  1.05155  1.05197  1.05155  1.05190
2017-01-02 02:01:00  1.05209  1.05209  1.05177  1.05179
2017-01-02 02:02:00  1.05177  1.05198  1.05177  1.05178
2017-01-02 02:03:00  1.05188  1.05200  1.05188  1.05200
2017-01-02 02:04:00  1.05196  1.05204  1.05196  1.05203

我想过滤每日数据以获得小时范围:

dt = datetime(2017,1,1)
df_day = df1[df.index.date == dt.date()]
df_day_t = df_day.between_time('08:30', '09:30')   

如果我执行 200 天的 for 循环,则需要几分钟。我怀疑这行的每一步

df_day = df1[df.index.date == dt.date()] 

正在寻找数据集中每一行的相等性(即使它是一个有序的数据集)。

有什么办法可以加快过滤速度,或者我应该做一些旧的命令for 从一月到十二月循环...?

【问题讨论】:

    标签: python pandas performance datetime pandas-groupby


    【解决方案1】:

    避免使用 Python datetime

    首先,您应该避免将 Python datetime 与 Pandas 操作结合使用。有许多 Pandas / NumPy 友好的方法可以创建 datetime 对象进行比较,例如pd.Timestamppd.to_datetime。您在这里的性能问题部分是由于docs 中描述的这种行为:

    pd.Series.dt.date 返回一个 python datetime.date 对象数组

    以这种方式使用 object dtype 会消除矢量化的好处,因为操作需要 Python 级循环。

    使用groupby 操作按日期聚合

    Pandas 已经具备通过标准化时间按日期分组的功能:

    for day, df_day in df.groupby(df.index.floor('d')):
        df_day_t = df_day.between_time('08:30', '09:30')
        # do something
    

    作为另一个示例,您可以通过这种方式访问​​特定日期的切片:

    g = df.groupby(df.index.floor('d'))
    my_day = pd.Timestamp('2017-01-01')
    df_slice = g.get_group(my_day)
    

    【讨论】:

    • 我不知道 pandas 中的 groupby... 现在需要几毫秒!
    猜你喜欢
    • 2017-12-15
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 2018-02-06
    • 2018-09-28
    • 1970-01-01
    相关资源
    最近更新 更多