【问题标题】:Convert monthly data to weekly data with pandas based on the monthly difference根据月差将月度数据转换为使用 pandas 的周数据
【发布时间】: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.")

这段代码的问题是:

  1. 这显然根本没有效率(我需要在 2006-2022 年期间对大约 12 个列执行此操作。
  2. 目前只能使用一年。
  3. 上个月产生了一个 IndexError,因为显然循环超出了索引,但是这需要在上述时间段内连续工作,而不会因错误而停止。

    是否有更有效的方法来创建此代码以更好地利用解决上述问题的 Pandas 功能?

    谢谢!

【问题讨论】:

    标签: python pandas python-datetime


    【解决方案1】:

    在屏蔽 duplicated 日期的值后,我会使用 interpolate,并暂时将周设置为索引以受益于 time 插值方法:

    df['DFF2'] = (df['DFF']
        .mask(df['Date'].duplicated())
        .set_axis(pd.to_datetime(df['Weeks']))
        .interpolate(method='time')
        .to_numpy()
    )
    

    输出:

              Date       DFF       Weeks      DFF2
    0   2006-01-01  4.090000  2006-01-01  4.090000
    1   2006-01-01  4.090000  2006-01-08  4.150667
    2   2006-01-01  4.090000  2006-01-15  4.211333
    3   2006-01-01  4.090000  2006-01-22  4.272000
    4   2006-01-01  4.090000  2006-01-29  4.332666
    5   2006-02-01  4.393333  2006-02-05  4.393333
    6   2006-02-01  4.393333  2006-02-12  4.469167
    7   2006-02-01  4.393333  2006-02-19  4.545000
    8   2006-02-01  4.393333  2006-02-26  4.620833
    9   2006-03-01  4.696667  2006-03-05  4.696667
    10  2006-03-01  4.696667  2006-03-12  4.696667
    11  2006-03-01  4.696667  2006-03-19  4.696667
    12  2006-03-01  4.696667  2006-03-26  4.696667
    

    【讨论】:

    • 太棒了,按预期工作。非常感谢@mozway!
    • 别客气!
    猜你喜欢
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    相关资源
    最近更新 更多