【问题标题】:pandas resampling for for nighttime hours大熊猫在夜间重新采样
【发布时间】:2019-10-09 10:06:16
【问题描述】:

我有一个多元时间序列数组。时间序列目前以 10 秒的间隔聚合:

**Time**
2016-01-11 17:00:00
2016-01-11 17:00:10
2016-01-11 17:00:20

我想重新采样,以便获得每天 5 小时的时间范围(时间在数据框中如何显示并不重要,重要的是它是否正确聚合)。我正在按平均值重新采样。

**Time**
2016-01-11 10:00:00-15:00:00
2016-01-12 10:00:00-15:00:00
2016-01-13 10:00:00-15:00:00

如何做到这一点?

【问题讨论】:

  • @BenPap “然后取其余的平均值”是什么意思?我会得到太多的间隔,我该如何摆脱不需要的间隔?
  • @QuangHoang 是的,这正是我的问题。
  • 我的意思是如果'00:00:00-04:59:59'是第一个块,那么20:00:00-23:59:59是最后一个块?
  • @QuangHoang 这不是我想要的。我想我在我的问题中说得很清楚。我想要每天 1 个 5 小时的时间间隔。
  • 是否必须从10:00:00 或00:00:00 开始有效?

标签: python pandas time-series


【解决方案1】:

首先我会过滤我想要的时间段并按天分组:

# mask the hours we want
hours = df.index.hour
mask = (hours >= 10) & (hours <=14)

# groupby
df[mask].groupby(df[mask].index.floor('D')).mean()

玩具数据:

Times = pd.date_range('2016-01-11', '2016-01-14', freq='10s')

np.random.seed(1)
df = pd.DataFrame({'Time': Times,
                   'Value': np.random.randint(1,10, len(Times))})

给予:

            Value
Time    
2016-01-11  4.993333
2016-01-12  5.030556
2016-01-13  5.012778

【讨论】:

  • 我感觉这会起作用,但我目前收到错误 'AttributeError: 'DatetimeIndex' object has no attribute 'dt''
  • DatetimeIndex 对象不需要通过dt 访问。
  • 我忘了你的时间是有索引的。正如@piRSquared 所说,只需删除所有.dt。让我更新。
【解决方案2】:
df.groupby([df['Time'].dt.month, df['Time'].dt.day]).apply(lambda x: x.set_index('Time').resample('5H').mean())

您必须先按时间列的月份和日期分组,然后在 5H(5 小时)内对您的时间列应用重新采样,然后是 .mean(),这将取其他列的平均值。

groupby 的原因是您不希望每天一整天都有 5 小时的间隔,只希望每天的时间。只要您的时间在 5 小时内,您一天只能获得一个间隔。

【讨论】:

  • 非常感谢您的回答,但是当我运行它时,我没有得到我想要的。它给了我每五个小时的平均值。我想要的是 10 到 15 小时之间所有数据的平均值。
  • df = df[(df['Time'].dt.hour &gt;= 10)&amp;(df['Time'].dt.hour &lt;= 15)].copy() 你可以先过滤它以获得你想要的时间,然后运行我上面的答案。
  • 同样的问题,除了现在它被隔离为第 10 小时的平均值和第 15 小时的平均值。我需要 10:00 到 15:00 之间的所有时间的平均值。
  • 在我的评论代码上将 15 更改为 14。我不小心多拉了一个小时。
猜你喜欢
  • 2022-06-10
  • 2021-06-01
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
相关资源
最近更新 更多