Pandas计算机每小时平均值并设置为时间间隔中心

4

我想计算风速和方向时间序列的每小时平均值,但我想将时间设置为半小时。因此,14:00到15:00之间的平均值将在14:30处。目前,我似乎只能得到区间左侧或右侧的平均值。以下是我目前拥有的:

ts_g=[item.replace(second=0, microsecond=0) for item in dates_g]
dg = {'ws': data_g.ws, 'wdir': data_g.wdir}
df_g = pandas.DataFrame(data=dg, index=ts_g, columns=['ws','wdir'])
grouped_g = df_g.groupby(pandas.TimeGrouper('H'))
hourly_ws_g = grouped_g['ws'].mean()
hourly_wdir_g = grouped_g['wdir'].mean()

这个的输出结果看起来像这样:
2016-04-08 06:00:00+00:00     46.980000
2016-04-08 07:00:00+00:00     64.313333
2016-04-08 08:00:00+00:00     75.678333
2016-04-08 09:00:00+00:00    127.383333
2016-04-08 10:00:00+00:00    145.950000
2016-04-08 11:00:00+00:00    184.166667
....

但我希望它能像这样:

2016-04-08 06:30:00+00:00     54.556
2016-04-08 07:30:00+00:00     78.001
....

感谢您的帮助!
2个回答

2
所以最简单的方法是重新采样,然后使用线性插值:
In [21]: rng = pd.date_range('1/1/2011', periods=72, freq='H')

In [22]: ts = pd.Series(np.random.randn(len(rng)), index=rng)
    ...: 

In [23]: ts.head()
Out[23]: 
2011-01-01 00:00:00    0.796704
2011-01-01 01:00:00   -1.153179
2011-01-01 02:00:00   -1.919475
2011-01-01 03:00:00    0.082413
2011-01-01 04:00:00   -0.397434
Freq: H, dtype: float64

In [24]: ts2 = ts.resample('30T').interpolate()

In [25]: ts2.head()
Out[25]: 
2011-01-01 00:00:00    0.796704
2011-01-01 00:30:00   -0.178237
2011-01-01 01:00:00   -1.153179
2011-01-01 01:30:00   -1.536327
2011-01-01 02:00:00   -1.919475
Freq: 30T, dtype: float64

In [26]: 

我相信这是你所需要的。

添加澄清示例

也许不使用随机数据更容易理解正在发生的事情:
In [29]: ts.head()
Out[29]: 
2011-01-01 00:00:00    0
2011-01-01 01:00:00    1
2011-01-01 02:00:00    2
2011-01-01 03:00:00    3
2011-01-01 04:00:00    4
Freq: H, dtype: int64

In [30]: ts2 = ts.resample('30T').interpolate()

In [31]: ts2.head()
Out[31]: 
2011-01-01 00:00:00    0.0
2011-01-01 00:30:00    0.5
2011-01-01 01:00:00    1.0
2011-01-01 01:30:00    1.5
2011-01-01 02:00:00    2.0
Freq: 30T, dtype: float64

0

这篇文章已经几年了,使用的API早已被弃用。现代Pandas已经提供了比pandas.TimeGrouper更易于使用的resample方法。然而,它只允许使用leftright标记的间隔,但获取间隔居中的间隔并不容易。

然而,这并不难做到。

首先,我们填充要重新采样的数据:

ts_g=[datetime.datetime.fromisoformat('2019-11-20') + 
      datetime.timedelta(minutes=10*x) for x in range(0,100)]
dg = {'ws': range(0,100), 'wdir': range(0,100)}

df_g = pd.DataFrame(data=dg, index=ts_g, columns=['ws','wdir'])
df_g.head()

输出将会是:

                       ws   wdir
2019-11-20 00:00:00     0   0
2019-11-20 00:10:00     1   1
2019-11-20 00:20:00     2   2
2019-11-20 00:30:00     3   3
2019-11-20 00:40:00     4   4

现在我们首先将采样重新调整为30分钟间隔

grouped_g = df_g.resample('30min')
halfhourly_ws_g = grouped_g['ws'].mean()
halfhourly_ws_g.head()

输出将会是:

2019-11-20 00:00:00     1
2019-11-20 00:30:00     4
2019-11-20 01:00:00     7
2019-11-20 01:30:00    10
2019-11-20 02:00:00    13
Freq: 30T, Name: ws, dtype: int64

最后,获取居中间隔的技巧:

hourly_ws_g = halfhourly_ws_g.add(halfhourly_ws_g.shift(1)).div(2)\
                             .loc[halfhourly_ws_g.index.minute % 60 == 30]
hourly_ws_g.head()

这将产生预期的输出:

2019-11-20 00:30:00     2.5
2019-11-20 01:30:00     8.5
2019-11-20 02:30:00    14.5
2019-11-20 03:30:00    20.5
2019-11-20 04:30:00    26.5
Freq: 60T, Name: ws, dtype: float64

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接