【问题标题】:Querying Python Pandas DataFrame with a Datetime index or column使用日期时间索引或列查询 Python Pandas DataFrame
【发布时间】:2017-04-15 06:26:33
【问题描述】:

所以,我是 Pandas 包的新手。 我正在对 ETF 的策略进行一些回测,我需要对 Pandas Dataframe 进行大量查询。

假设我是这两个 DataFrame,df 和 df1,唯一的区别是: df 有日期时间索引,而 df1 有时间戳作为列和整数索引

In[104]: df.head()
Out[104]: 

                       high     low    open   close   volume  openInterest
2007-04-24 09:31:00  148.28  148.12  148.23  148.15  2304400        341400
2007-04-24 09:32:00  148.21  148.14  148.14  148.19  2753500        449100
2007-04-24 09:33:00  148.24  148.13  148.18  148.14  2863400        109900
2007-04-24 09:34:00  148.18  148.12  148.13  148.16  3118287        254887
2007-04-24 09:35:00  148.17  148.14  148.16  148.16  3202112         83825

In[105]: df1.head()
Out[105]: 

                dates    high     low    open   close   volume  openInterest
0 2007-04-24 09:31:00  148.28  148.12  148.23  148.15  2304400        341400
1 2007-04-24 09:32:00  148.21  148.14  148.14  148.19  2753500        449100
2 2007-04-24 09:33:00  148.24  148.13  148.18  148.14  2863400        109900
3 2007-04-24 09:34:00  148.18  148.12  148.13  148.16  3118287        254887
4 2007-04-24 09:35:00  148.17  148.14  148.16  148.16  3202112         83825

所以我稍微测试一下查询速度:

In[100]: %timeit df1[(df1['dates'] >= '2015-11-17') & (df1['dates'] < '2015-11-18')]
%timeit df.loc[(df.index >= '2015-11-17') & (df.index < '2015-11-18')]
%timeit df.loc['2015-11-17']
100 loops, best of 3: 4.67 ms per loop
100 loops, best of 3: 3.14 ms per loop
1 loop, best of 3: 259 ms per loop

令我惊讶的是,使用 Pandas 内置的逻辑实际上是最慢的:

df.loc['2015-11-17']

有谁知道这是为什么? 有没有关于查询 Pandas DataFrame 的最有效方法的文档或博客?

【问题讨论】:

    标签: python datetime pandas dataframe


    【解决方案1】:

    如果我是你,我会使用更简单的方法:

    df['2015-11-17']  
    

    在我看来,这比在单个日期使用 .loc[] 更“熊猫逻辑”。我猜它也更快。

    测试一分钟的 OHLC 数据帧:

    %timeit df.loc[(df.index >= '2015-11-17') & (df.index < '2015-11-18')]
    %timeit df.loc['2015-11-17']
    %timeit df['2015-11-17']
    
    100 loops, best of 3: 13.8 ms per loop
    1 loop, best of 3: 1.39 s per loop
    1000 loops, best of 3: 486 us per loop
    

    【讨论】:

    • 谢谢,伙计!我也测试过,最简单的方法是最快的,应该是。你知道我在哪里可以全面了解 Pandas 的不同查询方法吗?
    • 哈哈我现在正在看,再次非常感谢!
    • @qichao_he 如果您对此感到满意,您应该接受答案。祝你有美好的一天
    • 我知道这已关闭,但请注意,AFAIK 仅适用于日期(老实说,甚至不确定它为什么适用)。通常df[...] 用于选择列,df.loc[...] 用于选择行。 Pandas 是面向列的(例如,每列是一个系列,数据框是一个系列数组),因此提取一列很快(只返回我已经拥有的系列),而提取一行很慢(必须提取数据从我收集的所有系列中创建一个新系列)。通常,在行索引上使用df[...] 不起作用...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 2017-11-16
    • 2017-08-13
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    相关资源
    最近更新 更多