每天过滤熊猫数据框

时间:2018-11-09 23:57:56

标签: python pandas performance datetime pandas-groupby

我有一个熊猫数据框,其中包含以分钟为单位的外汇数据,一年(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循环...?

1 个答案:

答案 0 :(得分:5)

避免使用Python datetime

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

  

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

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

使用groupby操作按日期进行汇总

熊猫已经具有通过归一化时间按日期分组的功能:

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)