在 Python 中将年度和月度数据转换为每周数据

时间:2021-04-22 21:57:24

标签: pandas dataframe date date-conversion pandas-resample

我当前的数据有以不同时间间隔记录的变量,我希望通过重新分配(每周 = 每月/4)或填写每周的每月值(每周 =每月)。

     df=pd.DataFrame({
                     'Date':['2020-06-03','2020-06-08','2020-06-15','2020-06-22','2020-06-29','2020-07-15','2020-08-15','2020-09-15','2020-10-14','2020-11-15','2020-12-15','2020-12-31','2021-01-15'],
                     'Date_Type':['Week_start_Mon','Week_start_Mon','Week_start_Mon','Week_start_Mon','Week_start_Mon','Monthly','Monthly','Monthly','Monthly','Monthly','Annual','Annual','Annual'],
                     'Var_Name':['A','A','A','A','B','C','C','C','E','F','G','G','H'],
                     'Var_Value':

[150,50,0,200,800,5000,2000,6000.15000,2300,3300,650000,980000,1240000]})





    Date    Date_Type   Var_Name    Var_Value
0   2020-06-03  Week_start_Mon  A   150.0
1   2020-06-08  Week_start_Mon  A   50.0
2   2020-06-15  Week_start_Mon  A   0.0
3   2020-06-22  Week_start_Mon  A   200.0
4   2020-06-29  Week_start_Mon  B   800.0
5   2020-07-15  Monthly C   5000.0
6   2020-08-15  Monthly C   2000.0
7   2020-09-15  Monthly C   6000.15
8   2020-10-14  Monthly E   2300.0
9   2020-11-15  Monthly F   3300.0
10  2020-12-15  Annual  G   650000.0
11  2020-12-31  Annual  G   980000.0
12  2021-01-15  Annual  H   1240000.0

理想的输出如下所示: 对于变量 C,日期范围将是主 df 的开始到结束日期。所有日期都对齐并设置为从该周的星期一开始。每月变量值均匀分布到 4 周,6 月的每周为 0。

类似地,年度变量将分布到 52 周。

  Date  Date_Type   Var_Name    Var_Value
    0   2020-06-01  Monthly C   0
    1   2020-06-08  Monthly C   0
    2   2020-06-15  Monthly C   0
    3   2020-06-22  Monthly C   0
    4   2020-06-29  Monthly C   0
    5   2020-07-06  Monthly C   1250
    6   2020-07-13  Monthly C   1250
    7   2020-07-20  Monthly C   1250
    8   2020-07-27  Monthly C   1250
    9   2020-08-03  Monthly C   400
   10   2020-08-10  Monthly C   400
   11   2020-08-17  Monthly C   400
   12   2020-08-24  Monthly C   400
   13   2020-08-31  Monthly C   400
   . 
   . 
   . 
   to the end date

对于变量 E,一个百分比值,需要在它适用的每周填充,输出将如下所示:

  Date  Date_Type   Var_Name    Var_Value
    0   2020-06-01  Monthly E   0
    1   2020-06-08  Monthly E   0
    2   2020-06-15  Monthly E   0
    3   2020-06-22  Monthly E   0
    .
    .
    .
    5   2020-09-28  Monthly E   0
    6   2020-10-05  Monthly E   0.35
    7   2020-10-12  Monthly E   0.35
    8   2020-10-19  Monthly E   0.35
    9   2020-10-26  Monthly E   0.35
   10   2020-11-02  Monthly E   0
   11   2020-11-09  Monthly E   0
   12   2020-11-16  Monthly E   0

最终我的目标是创建一个循环来处理此类数据

if weekly
     xxxxx
if monthly
     xxxxx
if annual
     xxxxx

请帮忙!

1 个答案:

答案 0 :(得分:0)

这是部分答案,我需要一些解释。

  1. Date 设置为索引并将所有日期重新调整为星期一(我假设 Date 已经是 datetime64 dtype)
df = df.set_index("Date")
df.index = df.index.map(lambda d: d - pd.tseries.offsets.Day(d.weekday()))
>>> df
           Date_Type Var_Name   Var_Value
Date
2020-06-01    Weekly        A      150.00
2020-06-08    Weekly        A       50.00
2020-06-15    Weekly        A        0.00
2020-06-22    Weekly        A      200.00
2020-06-29    Weekly        B      800.00
2020-07-13   Monthly        C     5000.00
2020-08-10   Monthly        C     2000.00
2020-09-14   Monthly        C     6000.15
2020-10-12   Monthly        E     2300.00
2020-11-09   Monthly        F     3300.00
2020-12-14    Annual        G   650000.00
2020-12-28    Annual        G   980000.00
2021-01-11    Annual        H  1240000.00
  1. 以 7 天的频率为从 2020-06-012021-01-11 的每个变量创建索引:
dti = pd.date_range(df.index.min(), df.index.max(), freq="7D", name="Date")
>>> dti
DatetimeIndex(['2020-06-01', '2020-06-08', '2020-06-15', '2020-06-22',
               '2020-06-29', '2020-07-06', '2020-07-13', '2020-07-20',
               '2020-07-27', '2020-08-03', '2020-08-10', '2020-08-17',
               '2020-08-24', '2020-08-31', '2020-09-07', '2020-09-14',
               '2020-09-21', '2020-09-28', '2020-10-05', '2020-10-12',
               '2020-10-19', '2020-10-26', '2020-11-02', '2020-11-09',
               '2020-11-16', '2020-11-23', '2020-11-30', '2020-12-07',
               '2020-12-14', '2020-12-21', '2020-12-28', '2021-01-04',
               '2021-01-11'],
              dtype='datetime64[ns]', name='Date', freq='7D')
  1. 使用新索引重新索引您的数据框(pivot 以获得更好的显示效果):
df = df.pivot(columns=["Date_Type", "Var_Name"], values="Var_Value").reindex(dti)
>>> df
Date_Type  Weekly         Monthly                    Annual
Var_Name        A      B        C       E       F         G          H
Date
2020-06-01  150.0    NaN      NaN     NaN     NaN       NaN        NaN
2020-06-08   50.0    NaN      NaN     NaN     NaN       NaN        NaN
2020-06-15    0.0    NaN      NaN     NaN     NaN       NaN        NaN
2020-06-22  200.0    NaN      NaN     NaN     NaN       NaN        NaN
2020-06-29    NaN  800.0      NaN     NaN     NaN       NaN        NaN
2020-07-06    NaN    NaN      NaN     NaN     NaN       NaN        NaN
2020-07-13    NaN    NaN  5000.00     NaN     NaN       NaN        NaN
2020-07-20    NaN    NaN      NaN     NaN     NaN       NaN        NaN
2020-07-27    NaN    NaN      NaN     NaN     NaN       NaN        NaN
2020-08-03    NaN    NaN      NaN     NaN     NaN       NaN        NaN
2020-08-10    NaN    NaN  2000.00     NaN     NaN       NaN        NaN
2020-08-17    NaN    NaN      NaN     NaN     NaN       NaN        NaN
2020-08-24    NaN    NaN      NaN     NaN     NaN       NaN        NaN
2020-08-31    NaN    NaN      NaN     NaN     NaN       NaN        NaN
2020-09-07    NaN    NaN      NaN     NaN     NaN       NaN        NaN
2020-09-14    NaN    NaN  6000.15     NaN     NaN       NaN        NaN
2020-09-21    NaN    NaN      NaN     NaN     NaN       NaN        NaN
2020-09-28    NaN    NaN      NaN     NaN     NaN       NaN        NaN
2020-10-05    NaN    NaN      NaN     NaN     NaN       NaN        NaN
2020-10-12    NaN    NaN      NaN  2300.0     NaN       NaN        NaN
2020-10-19    NaN    NaN      NaN     NaN     NaN       NaN        NaN
2020-10-26    NaN    NaN      NaN     NaN     NaN       NaN        NaN
2020-11-02    NaN    NaN      NaN     NaN     NaN       NaN        NaN
2020-11-09    NaN    NaN      NaN     NaN  3300.0       NaN        NaN
2020-11-16    NaN    NaN      NaN     NaN     NaN       NaN        NaN
2020-11-23    NaN    NaN      NaN     NaN     NaN       NaN        NaN
2020-11-30    NaN    NaN      NaN     NaN     NaN       NaN        NaN
2020-12-07    NaN    NaN      NaN     NaN     NaN       NaN        NaN
2020-12-14    NaN    NaN      NaN     NaN     NaN  650000.0        NaN
2020-12-21    NaN    NaN      NaN     NaN     NaN       NaN        NaN
2020-12-28    NaN    NaN      NaN     NaN     NaN  980000.0        NaN
2021-01-04    NaN    NaN      NaN     NaN     NaN       NaN        NaN
2021-01-11    NaN    NaN      NaN     NaN     NaN       NaN  1240000.0

剩下的就是填补缺失值了。如果我知道如何处理,那就很容易了:

if weekly
     xxxxx
if monthly
     xxxxx
if annual
     xxxxx
相关问题