【问题标题】:convert irregular time series to hourly data in python pandas在python pandas中将不规则时间序列转换为每小时数据
【发布时间】:2018-07-18 07:39:19
【问题描述】:

我有一个如下所示的数据框:

                read            value
0     2013-01-07 05:00:00        29.0
1     2013-01-08 15:00:00      4034.0
2     2013-01-09 20:00:00    256340.0
3     2013-01-10 20:00:00    343443.0
4     2013-01-11 20:00:00    4642435.0
5     2013-01-12 15:00:00    544296.0
6     2013-01-13 20:00:00    700000.0
7     2013-01-14 20:00:00    782335.0
8     2013-01-15 19:00:00    900000.0
9     2013-01-16 20:00:00    959130.0
10    2013-01-17 19:00:00   1114343.0
11    2013-01-18 20:00:00   1146230.0
12    2013-01-19 20:00:00   1247793.0
13    2013-01-20 20:00:00   1343376.0

我想对其进行转换和规范化,以便它显示一段时间内的每小时消耗量。到目前为止,我有以下内容

import numpy as np
import pandas as pd

#caluclates hourly delta
current['hour_delta'] = (current['read'] - current['read'].shift()).fillna(0).astype('timedelta64[h]')


#adds end date and then amount per hours
current['end_date'] = current['read'] + pd.to_timedelta(current['hour_delta'], unit='h')
current['infer_hour'] = current['value'] / current['hour_delta']

然后我创建系列

#create hourly time series
result = pd.Series(0, index=pd.date_range(start=current['read'].min(), end=current['read'].max(), freq='h'))

但是,从这里我无法弄清楚如何将小时费率应用于该系列。

【问题讨论】:

  • 您需要pandas.DatetimeIndex().resample(),它完全符合您的要求。 pandas.pydata.org/pandas-docs/stable/generated/…
  • 在这种情况下我将如何应用它?我觉得我把这件事弄得太复杂了
  • 我提供了文档的链接。它有例子。
  • @DYZ,如果我对 OP 的理解正确的话——它并不是那么简单,因为上采样......
  • @MaxU 上重采样有什么问题?

标签: python pandas


【解决方案1】:

您可以在 read 列上每小时重新采样一次。然后进行插值以填充空值。然后将每一行与下一行的差异。

例如,2013-01-07 05:00:002013-01-08 15:00:00 之间有 34 小时。如果我必须在 34 小时内分发 4034,那么每个小时的平均值应该是 4034 / 34118.647059

current.set_index('read').value.cumsum().resample('H').sum().interpolate().diff()

read
2013-01-07 05:00:00             NaN
2013-01-07 06:00:00      118.647059
2013-01-07 07:00:00      118.647059
2013-01-07 08:00:00      118.647059
2013-01-07 09:00:00      118.647059
2013-01-07 10:00:00      118.647059
2013-01-07 11:00:00      118.647059
2013-01-07 12:00:00      118.647059
2013-01-07 13:00:00      118.647059
2013-01-07 14:00:00      118.647059
2013-01-07 15:00:00      118.647059
2013-01-07 16:00:00      118.647059
2013-01-07 17:00:00      118.647059
2013-01-07 18:00:00      118.647059
2013-01-07 19:00:00      118.647059
...

【讨论】:

  • 我想显示所有小时的平均小时费率。这就是我创建结果系列的原因
  • 对我来说看起来是正确的。我似乎收到此错误 ValueError: cannot reindex from a duplicate axis
  • 这很聪明!
  • 我尝试在重新采样之前设置索引,但没有成功。我认为这是因为我的阅读列中有重复项?
  • @user3609179 我正在测试它......是的,这是正确的。我制作了一个副本并得到了错误......给我一点时间。好的!!我在resample 之后添加了sum 以合并所有重复项。
猜你喜欢
  • 2018-12-25
  • 2011-04-23
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
  • 1970-01-01
  • 2019-08-31
  • 2020-09-21
  • 2018-09-27
相关资源
最近更新 更多