提问人:Markus W 提问时间:9/11/2023 更新时间:9/11/2023 访问量:34
如何在 pandas 数据帧中创建 4 年周期的日数?
How can I create a day-number for a 4-year cycle in a pandas dataframe?
问:
我有带有日期时间索引、价格和周期阶段的时间序列数据。 我的数据帧如下所示:
日期索引 | 价格 | 循环阶段 | 日 |
---|---|---|---|
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 中做到最好?
答:
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
-
上一个:高效跟踪数据修订
评论