如何在 pandas 数据帧中创建 4 年周期的日数?

How can I create a day-number for a 4-year cycle in a pandas dataframe?

提问人:Markus W 提问时间:9/11/2023 更新时间:9/11/2023 访问量:34

问:

我有带有日期时间索引、价格和周期阶段的时间序列数据。 我的数据帧如下所示:

日期索引 价格 循环阶段
1928-01-03 00:00:00 71.04 0 1
1928-01-04 00:00:00 70.88 0 2
1928-01-05 00:00:00 70.2 0 3
1928-01-06 00:00:00 70.64 0 4
... ... ... ...
1929-05-09 00:00:00 104.08 1 400
1929-05-10 00:00:00 105.36 1 401
1929-05-11 00:00:00 104.96 1 402
1929-05-13 00:00:00 102.56 1 403
... ... ... ...
1930-11-08 00:00:00 63.56 2 844
1930-11-10 00:00:00 62.16 2 845
1930-11-11 00:00:00 63.16 2 846
... ... ... ...
1931-12-29 00:00:00 31.84 3 1185
1931-12-30 00:00:00 32.4 3 1186
1931-12-31 00:00:00 32.48 3 1187
1932-01-02 00:00:00 31.28 0 1
1932-01-04 00:00:00 30.24 0 2
1932-01-05 00:00:00 30.2 0 3
... ... ... ...

我想创建列“Day”,在该列中,它对数据帧中的每一行进行计数,直到循环重新启动。(当 CyclePhase 再次从 3 更改为 0 时)。

我怎样才能在 python 中做到最好?

python-3.x pandas 数据帧 时间序列 周期

评论


答:

1赞 Shubham Sharma 9/11/2023 #1

创建分组器以标记周期更改的行,计算 cumcount 以分配每个组的行号

s = df['CyclePhase'].diff().lt(0).cumsum()
df['Day'] = s.groupby(s).cumcount() + 1

              Dateindex   Price  CyclePhase  Day
0   1928-01-03 00:00:00   71.04           0    1
1   1928-01-04 00:00:00   70.88           0    2
2   1928-01-05 00:00:00   70.20           0    3
3   1928-01-06 00:00:00   70.64           0    4
4   1929-05-09 00:00:00  104.08           1    5
5   1929-05-10 00:00:00  105.36           1    6
6   1929-05-11 00:00:00  104.96           1    7
7   1929-05-13 00:00:00  102.56           1    8
8   1930-11-08 00:00:00   63.56           2    9
9   1930-11-10 00:00:00   62.16           2   10
10  1930-11-11 00:00:00   63.16           2   11
11  1931-12-29 00:00:00   31.84           3   12
12  1931-12-30 00:00:00   32.40           3   13
13  1931-12-31 00:00:00   32.48           3   14
14  1932-01-02 00:00:00   31.28           0    1
15  1932-01-04 00:00:00   30.24           0    2
16  1932-01-05 00:00:00   30.20           0    3

评论

0赞 Markus W 9/12/2023
您碰巧知道我如何将每个周期的所有价格除以第 1 天的值吗?
0赞 Shubham Sharma 9/12/2023
很高兴提供帮助,它很简单,只需首先进行转换:df['New_Price'] = df['Price'] / df.groupby('Day')['Price'].transform('first')
1赞 Quang Hoang 9/11/2023 #2

您可以按年份分组,如下所示:

df['Day'] = df.groupby(df['Dateindex'].dt.year // 4).cumcount().add(1)

如果您的数据从某个年份开始,而该年份不能被 整除,那么您可以执行以下操作:4

years = df['Dateindex'].dt.year
df['Day'] = df.groupby(years.sub(years.min()) // 4).cumcount().add(1)

注意:如果 ur 确实是索引,那么Dateindex

years = df.index.year

评论

0赞 Markus W 9/12/2023
多谢。第一行效果很好。无法被 4 整除的年份版本会带来错误“ AttributeError: 'Float64Index' object has no attribute 'sub' ”
0赞 Quang Hoang 9/12/2023
哦,那就用正常操作替换一下就好了。sub-