pandas 将每日数据准确地向前移动一个月(而不是30天)

qltillow  于 2023-03-28  发布在  其他
关注(0)|答案(1)|浏览(146)

我想将每日数据的日期索引向前移动一个月。这是为了通过计算两个 Dataframe 来计算每日数据的逐月滚动变化,其中一个 Dataframe 具有正确的时间戳,另一个 Dataframe 具有向前移动一个月的时间戳,而所有其他数据列都相同
问题是并非所有月份的长度都相同,所以我不想将其向前滚动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")

发生的事情是我得到下一个月的结束或开始的所有天在当前月份。例如所有三月的每日数据天去四月的结束或开始。
会非常感激你的意见。

wlzqhblo

wlzqhblo1#

您可以使用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

相关问题