【问题标题】:Python Pandas Time Series ManipulationPython Pandas 时间序列操作
【发布时间】:2017-06-14 00:55:05
【问题描述】:

我有一个具有以下结构的熊猫数据框:

                     Date     Open     High      Low    Close  Volume
0     2003-10-01 00:00:00  1.16500  1.16700  1.16400  1.16690    1125
1     2003-10-01 01:00:00  1.16680  1.16790  1.16600  1.16720     933
............

这些是连续的时间值,因为它是 Eur/Usd 数据。 我想对此重新采样,创建一个每日数据框,该数据框使用日期 XXXX-XX-XX 09:00:00 的打开列上的值作为打开值,关闭值使用 XXXX-XX-XX 16:00:00 的关闭列值.高低应该是 XXXX-XX-XX 09:00:00 和 XXXX-XX-XX 16:00:00 之间的高高和低低。 交易量应该是 XXXX-XX-XX 09:00:00 和 XXXX-XX-XX 16:00:00 之间交易量的总和。 有没有简单的方法可以在熊猫中做到这一点? 怎么做?

谢谢

【问题讨论】:

  • 你必须重新表述你的问题。
  • 我有一个 24 小时金融时间序列 OHLC 和 1 小时时间范围的体积数据,我想将其重新采样为每日时间范围,但仅使用 09:00:00 到 17:00:00 之间的数据

标签: python pandas time-series resampling


【解决方案1】:

仅在 09:00:00 到 16:00:00 之间的时间。

between_time 是一种获得所需时间的好方法

ts = ts.between_time('9:00','16:00')

重采样使用推荐的语法:

为了避免在您实施resample 时出现“未来警告”,请尝试以下操作:

ohlc_dict = {                                                                                                             
'Open':'first',                                                                                                    
'High':'max',                                                                                                       
'Low':'min',                                                                                                        
'Close': 'last',                                                                                                    
'Volume': 'sum'  }

dailyData = ts.resample('1d').agg(ohlc_dict)

【讨论】:

  • 很好,我不知道between_time。直到。
【解决方案2】:

谢谢,我也找到了这个解决方案:

ohlc_dict = {                                                                                                             
'Open':'first',                                                                                                    
'High':'max',                                                                                                       
'Low':'min',                                                                                                        
'Close': 'last',                                                                                                    
'Volume': 'sum'  }

df_filtered_daily = df_filtered.resample('D', how=ohlc_dict, closed='left', label='left')

【讨论】:

    【解决方案3】:

    这是一个两步过程。首先,您需要删除超出每日每小时范围的数据;那么您需要将其重新采样为每日频率。

    假设这是我们的时间序列:

    import pandas as pd
    import numpy as np
    ts = pd.Series(np.random.random(72), index=pd.date_range('1/1/2011', periods=72, freq='H'))
    

    要按小时过滤,我们可以创建一个布尔数组,询问数据中的每个时间戳是否在我们感兴趣的小时内,然后使用它来索引我们的时间序列:

    ts_filtered = ts[ts.index.map(lambda time: 9 <= time.hour <= 17)]
    

    然后,要重新采样,只需使用 resample:

    daily_stats = ts_filtered.resample('D').mean()
    

    这让我们:

    2011-01-01    0.507943
    2011-01-02    0.416317
    2011-01-03    0.573760
    Freq: D, dtype: float64
    

    【讨论】:

    • 谢谢,太好了,只是我错过了一部分,对于打开重采样列,我需要使用 09:00:00 打开值,而对于关闭列,我需要使用 17: 00:00 收盘价。对于高列,我需要使用 09:00:00-17:00:00 范围内的最大值。有没有办法做到这一点?谢谢
    • 是的。不要以mean() 结束最后一条语句,而是使用agg(),向它传递一个字典,其中键是每个变量名,值是您想要对它们执行的函数。就您而言,听起来您需要ts_filtered.resample('D').agg({'High': max, 'Open': lambda vals: vals.values[0], 'Close': lambda vals: vals.values[-1]})
    • 这最后一段向我抛出了以下错误:IndexError: index -1 is out of bounds for axis 0 with size 0
    • 这意味着其中一个组是空的。不确定,但我认为你不应该得到那个...试试lambda vals: vals.values[-1] if len(vals) else float('NaN')
    猜你喜欢
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 2020-04-12
    • 2019-05-16
    • 2022-11-22
    相关资源
    最近更新 更多