【问题标题】:Resample intraday pandas DataFrame without add new days在不添加新日期的情况下重新采样盘中 pandas DataFrame
【发布时间】:2013-01-31 15:45:35
【问题描述】:

我想在不添加新日期的情况下对一些日内数据进行下采样

df.resample('30Min')

将添加周末等,这是不可取的。反正有这个吗?

【问题讨论】:

  • 我发现这是 pandas 的一个主要问题,这个问题一遍又一遍地提出,并且没有标准的解决方案。

标签: python pandas time-series


【解决方案1】:

可能最简单的方法是之后只做一个dropna 以摆脱空行,例如

df.resample('30Min').dropna()

【讨论】:

  • 这对我不起作用:AttributeError: 'DatetimeIndexResampler' object has no attribute 'dropna'
  • 这个答案可能适用于 pandas 0.16 左右;我相信 resample api 从 0.18 开始完全改变,我们现在是 0.24。
【解决方案2】:

组合的 groupby/resample 可能会起作用:

In [22]: dates = pd.date_range('01-Jan-2014','11-Jan-2014', freq='T')[0:-1]
    ...: dates = dates[dates.dayofweek < 5]
    ...: s = pd.TimeSeries(np.random.randn(dates.size), dates)
    ...: 

In [23]: s.size
Out[23]: 11520

In [24]: s.groupby(lambda d: d.date()).resample('30min').size
Out[24]: 384

In [25]: s.groupby(lambda d: d.date()).resample('30min')
Out[25]: 
2014-01-01  2014-01-01 00:00:00    0.202943
            2014-01-01 00:30:00   -0.466010
            2014-01-01 01:00:00    0.029175
            2014-01-01 01:30:00   -0.064492
            2014-01-01 02:00:00   -0.113348
            2014-01-01 02:30:00    0.100408
            2014-01-01 03:00:00   -0.036561
            2014-01-01 03:30:00   -0.029578
            2014-01-01 04:00:00   -0.047602
            2014-01-01 04:30:00   -0.073846
            2014-01-01 05:00:00   -0.410143
            2014-01-01 05:30:00    0.143853
            2014-01-01 06:00:00   -0.077783
            2014-01-01 06:30:00   -0.122345
            2014-01-01 07:00:00    0.153003
...
2014-01-10  2014-01-10 16:30:00   -0.107377
            2014-01-10 17:00:00   -0.157420
            2014-01-10 17:30:00    0.201802
            2014-01-10 18:00:00   -0.189018
            2014-01-10 18:30:00   -0.310503
            2014-01-10 19:00:00   -0.086091
            2014-01-10 19:30:00   -0.090800
            2014-01-10 20:00:00   -0.263758
            2014-01-10 20:30:00   -0.036789
            2014-01-10 21:00:00    0.041957
            2014-01-10 21:30:00   -0.192332
            2014-01-10 22:00:00   -0.263690
            2014-01-10 22:30:00   -0.395939
            2014-01-10 23:00:00   -0.171149
            2014-01-10 23:30:00    0.263057
Length: 384

In [26]: np.unique(_25.index.get_level_values(1).minute)
Out[26]: array([ 0, 30])

In [27]: np.unique(_25.index.get_level_values(1).dayofweek)
Out[27]: array([0, 1, 2, 3, 4]) 

【讨论】:

    【解决方案3】:

    目前最简单的解决方法可能是:

    rs = df.resample('30min')
    rs[rs.index.dayofweek < 5]
    

    【讨论】:

    • 谢谢,张。我选择了另一个答案,因为它更灵活 - 不会在假期中添加。感谢您在 pandas 上所做的工作,它很棒!
    猜你喜欢
    • 1970-01-01
    • 2021-12-14
    • 2018-05-22
    • 2018-03-11
    • 2020-09-29
    • 1970-01-01
    • 2013-12-06
    • 2020-11-06
    • 2017-05-20
    相关资源
    最近更新 更多