按一年间隔分组,以该系列的第一个数据点开始

问题描述 投票:0回答:2

如何对间隔为 1 年的时间序列进行分组,以便第一个间隔的开始是第一个数据点,并且新系列由该起始点标记?

例如这里我有一个从

2000-01-11
开始的系列,所以第一个间隔应该包含
2000-01-11
2001-01-10
之间的所有数据点,第二个
2001-01-11
2002-01-10
等;新系列的标签 2000-01-11、2001-01-11 等?

import pandas as pd
import numpy as np

i = pd.date_range('2000-01-11', '2022-02-10', freq='D')
t = pd.Series(index=i, data=np.random.randint(0,100,len(i)))
print(t)

t.groupby(pd.Grouper(freq='1Y', origin='start', label='left')).mean()

此代码似乎在年初进行分类,并在年底进行标记。

python pandas datetime group-by intervals
2个回答
2
投票

IIUC,您可以使用

pd.cut
并按以下类别分组:

x = pd.cut(
    i,
    pd.date_range(start="1999-12-31", end="2022-02-10", freq="12M")
    + pd.offsets.DateOffset(11),
    right=False,
    include_lowest=True
)

out = t.groupby(x).mean()
print(out)

打印:

[2000-01-11, 2001-01-11)    51.174863
[2001-01-11, 2002-01-11)    48.197260
[2002-01-11, 2003-01-11)    49.400000
[2003-01-11, 2004-01-11)    50.509589
[2004-01-11, 2005-01-11)    49.680328
[2005-01-11, 2006-01-11)    48.334247
[2006-01-11, 2007-01-11)    47.882192
[2007-01-11, 2008-01-11)    51.405479
[2008-01-11, 2009-01-11)    50.437158
[2009-01-11, 2010-01-11)    49.520548
[2010-01-11, 2011-01-11)    48.591781
[2011-01-11, 2012-01-11)    51.643836
[2012-01-11, 2013-01-11)    51.084699
[2013-01-11, 2014-01-11)    50.334247
[2014-01-11, 2015-01-11)    51.109589
[2015-01-11, 2016-01-11)    48.230137
[2016-01-11, 2017-01-11)    49.691257
[2017-01-11, 2018-01-11)    47.326027
[2018-01-11, 2019-01-11)    48.728767
[2019-01-11, 2020-01-11)    47.947945
[2020-01-11, 2021-01-11)    48.866120
[2021-01-11, 2022-01-11)    49.268493
dtype: float64

1
投票

我最初误读了这个问题。

origin
不适用于非固定频率,例如年份。

这适用于固定频率,例如天:

t.groupby(pd.Grouper(freq='365.25D', origin='start_day', label='left')).mean()

输出:

2000-01-11 00:00:00    49.991803
2001-01-10 06:00:00    46.619178
2002-01-10 12:00:00    49.205479
2003-01-10 18:00:00    51.326027
2004-01-11 00:00:00    50.131148
2005-01-10 06:00:00    49.093151
2006-01-10 12:00:00    52.780822
2007-01-10 18:00:00    49.202740
2008-01-11 00:00:00    53.237705
2009-01-10 06:00:00    51.936986
2010-01-10 12:00:00    48.663014
2011-01-10 18:00:00    48.175342
2012-01-11 00:00:00    50.117486
2013-01-10 06:00:00    48.838356
2014-01-10 12:00:00    49.520548
2015-01-10 18:00:00    47.997260
2016-01-11 00:00:00    51.068306
2017-01-10 06:00:00    47.731507
2018-01-10 12:00:00    46.290411
2019-01-10 18:00:00    47.753425
2020-01-11 00:00:00    48.046448
2021-01-10 06:00:00    52.131507
2022-01-10 12:00:00    55.032258
Freq: 8766H, dtype: float64
© www.soinside.com 2019 - 2024. All rights reserved.