将每日数据向前移动整整一个月(不是 30 天)

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

我想将每日数据的日期索引向前移动一个月。这是为了通过计算两个数据帧来计算每日数据的逐月滚动变化 - 具有正确时间戳的现有数据帧和时间戳与所有其他数据列一起向前移动一个月的新数据帧一样

问题是并不是所有的月份都有相同的长度,所以我不想将它向前滚动 30 天。例如,我希望 3 月 24 日与 2 月 24 日(28 天)匹配,4 月 24 日与 3 月 24 日(31 天)匹配。

我尝试了以下变体,但并不高兴:

df= pd.read_csv("seven_day.csv", parse_dates=['Date'], index_col=['Date'])

df.shift(periods=1, freq="M")
df.shift(periods=1, freq="MS")

发生的事情是我在当月的所有日子里得到下个月的结束或开始。例如,所有 3 月的每日数据日都到 4 月末或月初。

非常感谢任何见解。

python pandas datetime python-dateutil
1个回答
0
投票

您可以使用

DateOffset

df.set_index(df.index+pd.DateOffset(months=1))

例子:

df = pd.DataFrame({'data': range(6)},
                   index=pd.to_datetime(['2022-12-31', '2023-01-24',
                                         '2023-01-31', '2023-02-24',
                                         '2023-02-28', '2023-03-31']))

df.join(df.set_index(df.index+pd.DateOffset(months=1)).add_suffix('_shift'))

输出:

            data  data_shift
2022-12-31     0         NaN
2023-01-24     1         NaN
2023-01-31     2         0.0 # matches 2021-12-31
2023-02-24     3         1.0 # matches 2023-01-24
2023-02-28     4         2.0 # matches 2023-01-31
2023-03-31     5         NaN

中级:

df.set_index(df.index+pd.DateOffset(months=1)).add_suffix('_shift')

            data_shift
2023-01-31           0
2023-02-24           1
2023-02-28           2
2023-03-24           3
2023-03-28           4
2023-04-30           5

反过来(注意
-
标志):

df.join(df.set_index(df.index-pd.DateOffset(months=1)).add_suffix('_shift'))
# or
df.join(df.set_index(df.index+pd.DateOffset(months=-1)).add_suffix('_shift'))

输出:

            data  data_shift
2022-12-31     0         2.0 # matches 2021-01-31
2023-01-24     1         3.0 # matches 2021-02-24
2023-01-31     2         NaN
2023-02-24     3         NaN
2023-02-28     4         5.0 # matches 2023-03-31
2023-03-31     5         NaN

中级:

df.set_index(df.index-pd.DateOffset(months=1)).add_suffix('_shift')

            data_shift
2022-11-30           0
2022-12-24           1
2022-12-31           2
2023-01-24           3
2023-01-28           4
2023-02-28           5
© www.soinside.com 2019 - 2024. All rights reserved.