【发布时间】:2023-01-26 19:46:23
【问题描述】:
我正在尝试将每月数据转换为每周数据,但是,我想根据每月差异不断更新每周值,而不是简单地复制值(如下所示)或将其除以 n 周。我的原始数据框如下所示:
Date DFF Weeks
0 2006-01-01 4.090000 2006-01-01
1 2006-01-01 4.090000 2006-01-08
2 2006-01-01 4.090000 2006-01-15
3 2006-01-01 4.090000 2006-01-22
4 2006-01-01 4.090000 2006-01-29
5 2006-02-01 4.393333 2006-02-05
6 2006-02-01 4.393333 2006-02-12
7 2006-02-01 4.393333 2006-02-19
8 2006-02-01 4.393333 2006-02-26
9 2006-03-01 4.696667 2006-03-05
10 2006-03-01 4.696667 2006-03-12
11 2006-03-01 4.696667 2006-03-19
12 2006-03-01 4.696667 2006-03-26
我想要看起来像这样的东西:
Date DFF Weeks
0 2006-01-01 4.090000 2006-01-01
1 2006-01-01 4.150667 2006-01-08
2 2006-01-01 4.211333 2006-01-15
3 2006-01-01 4.272000 2006-01-22
4 2006-01-01 4.332667 2006-01-29
5 2006-02-01 4.393333 2006-02-05
6 2006-02-01 4.469167 2006-02-12
7 2006-02-01 4.545000 2006-02-19
8 2006-02-01 4.620833 2006-02-26
9 2006-03-01 4.696667 2006-03-05
10 2006-03-01 4.696667 2006-03-12
11 2006-03-01 4.696667 2006-03-19
12 2006-03-01 4.696667 2006-03-26
例如在第一种情况下,我计算了第 1 个月和第 2 个月之间的差值,将这个值除以第 1 个月的周数,然后不断地加上(或减去)第 1 个月的值。
我编写了以下代码来创建此数据框:
dates = df.Date.drop_duplicates().to_list()
months = [cur_date.month for cur_date in dates]
year = 2006
for idx in range(len(weeks)):
try:
df_1 = df[(df.Date.dt.month == months[idx]) & (df.Date.dt.year == year)].copy()
df_2 = df[(df.Date.dt.month == months[idx+1]) & (df.Date.dt.year == year)].copy()
val_1 = df_1.DFF.to_list()[0]
val_2 = df_2.DFF.to_list()[0]
diff = val_2 - val_1
div_diff = diff / (len(df_1))
new_values = []
for i in range(len(df_1)-1):
val_1 += div_diff
new_values.append(val_1)
indexes = df_1.index.to_list()
df.DFF[indexes[1]:indexes[-1]+1] = new_values
except:
raise IndexError("Last month of dataframe.")
这段代码的问题是:
- 这显然根本没有效率(我需要在 2006-2022 年期间对大约 12 个列执行此操作。
- 目前只能使用一年。
- 上个月产生了一个 IndexError,因为显然循环超出了索引,但是这需要在上述时间段内连续工作,而不会因错误而停止。
是否有更有效的方法来创建此代码以更好地利用解决上述问题的 Pandas 功能?
谢谢!
【问题讨论】:
标签: python pandas python-datetime