【问题标题】:Python pandas "filter" a time series for trading days onlyPython pandas 仅“过滤”交易日的时间序列
【发布时间】:2014-11-26 23:14:53
【问题描述】:

我有两个如下所示的数据集:

我想做的是在“数据”数据框上过滤掉非交易日。我假设它将每行的 data.index.date 与 trading_days 的 data.index.date 进行比较,然后在匹配时返回该行。如果不匹配,则不是交易日,不返回该行。这有效地过滤掉了非交易日的数据集。

但是,在这里逐行检查两个 data.index.dates 是否相等,使用 apply() 函数返回行似乎效率低下 - 我觉得有一种更有效的方法可以做到这一点,因为我将在 180M 行数据帧上执行此操作。

是否有某种“合并”或“加入”,例如:

data.join(trading_days) 

只过滤 date.index.date 匹配的日期?我需要按分钟级别获取所有信息(如“数据”数据框中所示),但只需过滤掉非交易日期。感谢您的帮助!

更新以包含值(如果有更好的粘贴方法,请告诉我):

In[5]: data.head(30).values
Out[6]: 
array([[ 438.9,  438.9,  438.9,  438.9,    0. ],
       [ 438.9,  438.9,  438.7,  438.7,   31. ],
       [ 438.6,  438.6,  438.6,  438.6,    7. ],
       [ 438.4,  438.7,  438.4,  438.4,    4. ],
       [ 438.4,  438.4,  438.3,  438.3,    4. ],
       [ 438.2,  438.2,  438.2,  438.2,    1. ],
       [ 438.2,  438.2,  438.2,  438.2,    0. ],
       [ 438.2,  438.2,  438.2,  438.2,    1. ],
       [ 438.2,  438.2,  438.2,  438.2,    0. ],
       [ 438.1,  438.1,  438.1,  438.1,    3. ],
       [ 438. ,  438. ,  437.9,  438. ,    6. ],
       [ 438. ,  438.2,  438. ,  438. ,    8. ],
       [ 438.2,  438.2,  438.1,  438.1,    6. ],
       [ 438.1,  438.1,  438.1,  438.1,    4. ],
       [ 438.1,  438.1,  438.1,  438.1,    0. ],
       [ 438.3,  438.3,  438.3,  438.3,    1. ],
       [ 438.3,  438.3,  438.3,  438.3,    0. ],
       [ 438.3,  438.3,  438.3,  438.3,    0. ],
       [ 438.1,  438.1,  438.1,  438.1,    1. ],
       [ 438. ,  438. ,  437.9,  437.9,   54. ],
       [ 437.8,  437.8,  437.8,  437.8,   10. ],
       [ 437.8,  437.8,  437.8,  437.8,    1. ],
       [ 437.8,  437.8,  437.8,  437.8,    6. ],
       [ 437.8,  437.8,  437.8,  437.8,    0. ],
       [ 437.9,  438. ,  437.9,  438. ,   12. ],
       [ 437.9,  438. ,  437.9,  438. ,    0. ],
       [ 437.9,  438. ,  437.9,  438. ,    0. ],
       [ 437.9,  438. ,  437.9,  438. ,    0. ],
       [ 437.9,  437.9,  437.9,  437.9,    1. ],
       [ 437.9,  437.9,  437.8,  437.8,    4. ]])

以下是时间戳:

In[10]: data.head(30).index.values
Out[11]: 
array(['2005-01-02T13:59:00.000000000-0500',
       '2005-01-02T14:00:00.000000000-0500',
       '2005-01-02T14:01:00.000000000-0500',
       '2005-01-02T14:02:00.000000000-0500',
       '2005-01-02T14:03:00.000000000-0500',
       '2005-01-02T14:04:00.000000000-0500',
       '2005-01-02T14:05:00.000000000-0500',
       '2005-01-02T14:06:00.000000000-0500',
       '2005-01-02T14:07:00.000000000-0500',
       '2005-01-02T14:08:00.000000000-0500',
       '2005-01-02T14:09:00.000000000-0500',
       '2005-01-02T14:10:00.000000000-0500',
       '2005-01-02T14:11:00.000000000-0500',
       '2005-01-02T14:12:00.000000000-0500',
       '2005-01-02T14:13:00.000000000-0500',
       '2005-01-02T14:14:00.000000000-0500',
       '2005-01-02T14:15:00.000000000-0500',
       '2005-01-02T14:16:00.000000000-0500',
       '2005-01-02T14:17:00.000000000-0500',
       '2005-01-02T14:18:00.000000000-0500',
       '2005-01-02T14:19:00.000000000-0500',
       '2005-01-02T14:20:00.000000000-0500',
       '2005-01-02T14:21:00.000000000-0500',
       '2005-01-02T14:22:00.000000000-0500',
       '2005-01-02T14:23:00.000000000-0500',
       '2005-01-02T14:24:00.000000000-0500',
       '2005-01-02T14:25:00.000000000-0500',
       '2005-01-02T14:26:00.000000000-0500',
       '2005-01-02T14:27:00.000000000-0500',
       '2005-01-02T14:28:00.000000000-0500'], dtype='datetime64[ns]')

trading_days 是来自这里的 read.csv:http://pastebin.com/5N01Gi5V

第二次更新:

【问题讨论】:

  • 您能以纯文本形式发布一些示例数据吗?

标签: python pandas trading


【解决方案1】:

您可以通过以下方式加入:

  1. days 列添加到包含索引日期的data
  2. pd.merge(days, data, on='days')

默认情况下会进行内部连接,因此只有data 中出现在days 框架中的天数的行才会出现在结果中。

【讨论】:

  • 对于这两个答案,我都做了:data['days'] = data.index.datedf = pd.merge(trading_days, data, on='days')# df = data.merge(trading_days, how='inner', left_on='days', right_index=True)df.count() 我得到一个空数据框..这可能是一个愚蠢的错误,但我不确定我明白为什么'days' 的合并不会返回任何内容。
  • 检查两个数据框中“天”列的类型。 data.index.date 将返回 datetime 对象。
  • 啊我明白了。好的,我能够合并,但现在我看到索引中缺少我所有的分钟数据(因为它在原始“数据”数据框中存在)。关于如何合并但保留此索引的任何想法?
  • 我通过使用df = pd.merge(trading_days, data, on='days', left_index=True) 来保留索引得到它感谢您的所有帮助(以及 Bob 的帮助)!
【解决方案2】:

你在正确的轨道上。我将在数据数据框中创建另一列,其中包含索引中的日期时间值,但格式与您的 trading_days 数据框中使用的格式相似。所以 2005-01-02 23:59:00*00:00 变成 2005-01-02

然后你可以使用 Merge http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.merge.html

data.merge (trading_days, how='inner', left_on='newcolumn', right_index=True)

【讨论】:

    猜你喜欢
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 2016-12-18
    • 2018-02-02
    • 1970-01-01
    相关资源
    最近更新 更多