【问题标题】:Changing monthly values to daily by evenly distributing between dates通过在日期之间均匀分布将每月值更改为每日
【发布时间】:2020-08-14 10:50:04
【问题描述】:

我有每月数据集

df = pd.DataFrame({'Month':[1,2],
                   'Plan':[310,620],
                'Month_start_date': ['2020-01-01','2020-02-01']})
print(df)

df['Month_start_date'] = (pd.to_datetime(df['Month_start_date'], format='%Y/%m/%d')
                     .dt.to_period('m').dt.to_timestamp())

df = df.set_index('Month_start_date')

我以我想重新索引的格式创建了一个日期列表

start = '2020-01-01'
end = '2020-02-29'
dates = pd.date_range(start, end, freq='D')
dates

当我尝试使用此代码将数据框更改为每日时

df_daily = df.reindex(dates, method='ffill')
print(df_daily)

这是我得到的输出

           Month  Plan
2020-01-01      1   310
2020-01-02      1   310
2020-01-03      1   310
2020-01-04      1   310
2020-01-05      1   310
2020-01-06      1   310
2020-01-07      1   310
2020-01-08      1   310
2020-01-09      1   310
2020-01-10      1   310
...

该列表按预期持续到 2 月 29 日。然而,每天的计划都是一样的。我怎样才能让它看起来像这样?

            Month  Plan
2020-01-01      1   10
2020-01-02      1   10
2020-01-03      1   10
2020-01-04      1   10
2020-01-05      1   10
2020-01-06      1   10
2020-01-07      1   10
2020-01-08      1   10
2020-01-09      1   10
2020-01-10      1   10
...

2020-02-17      2   21.38
2020-02-18      2   21.38
2020-02-19      2   21.38
2020-02-20      2   21.38
2020-02-21      2   21.38
2020-02-22      2   21.38
2020-02-23      2   21.38
2020-02-24      2   21.38
2020-02-25      2   21.38
2020-02-26      2   21.38
2020-02-27      2   21.38
2020-02-28      2   21.38
2020-02-29      2   21.38

只需将计划除以当月的天数,即可在所有日期之间平均分配。由于 2 月份的计划是 620,所以每天得到 620/29,即 21.38

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    Pandas 有一个函数为number of days in a month

    df_daily["Daily plan"] = df_daily["Plan"] / df_daily.index.daysinmonth
    

    【讨论】:

      【解决方案2】:

      Keldorn 的方法更好,如果你有一些方便的辅助函数来告诉你每个周期的长度。但这是使用groupby() 的更通用的方法:

      # EITHER OF THESE:
      df.reindex(dates, method='ffill').groupby('Month').transform(lambda x: x/x.size)
      df.reindex(dates, method='ffill').groupby('Month').transform(lambda x: x/len(x))
      
                      Plan
      2020-01-01  10.00000
      2020-01-02  10.00000
      ...
      2020-01-31  10.00000
      2020-02-01  21.37931
      2020-02-02  21.37931
      ...
      2020-02-29  21.37931
      

      您可以将输出分配给df['Plan']df['Plan_daily'] 或其他。

      【讨论】:

        猜你喜欢
        • 2021-09-27
        • 2021-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-06
        • 2021-01-26
        • 2021-12-19
        • 1970-01-01
        相关资源
        最近更新 更多