【问题标题】:Pandas resampling from months to weeks熊猫从几个月到几周重新采样
【发布时间】:2018-06-16 19:00:46
【问题描述】:

我正在尝试将每月数据下采样为每周数据,并有一个月份的时间序列数据框,如下所示:

             qty
PERIOD_NAME 
2017-09-01  49842.0
2017-10-01  27275.0
2017-11-01  29159.0
2017-12-01  51344.0
2018-01-01  19103.0
2018-02-01  23570.0
2018-03-01  45139.0
2018-04-01  25722.0
2018-05-01  22644.0

我尝试过像这样对几周进行重新采样:

tgt_item_by_445_wk = tgt_item_by_445_wk.resample('W').sum()

产生:

             qty
PERIOD_NAME 
2017-09-03  49842.0
2017-09-10  0.0
2017-09-17  0.0
2017-09-24  0.0
2017-10-01  27275.0
2017-10-08  0.0
2017-10-15  0.0
2017-10-22  0.0
2017-10-29  0.0

我尝试过插值,但我无法得到我想要的东西,它是未采样 (0) 的填充,第一个值是这样的:

              qty
PERIOD_NAME 
2017-09-03  12460.5
2017-09-10  12460.5
2017-09-17  12460.5
2017-09-24  12460.5
2017-10-01  5455.0
2017-10-08  5455.0
2017-10-15  5455.0
2017-10-22  5455.0
2017-10-29  5455.0

是否有一些使用重采样、填充和插值的方法可以做到这一点?

【问题讨论】:

  • 上个月的条目2018-05-01 22644.0 没有被重新采样并且值没有被拆分,是否如预期的那样?

标签: python pandas


【解决方案1】:

让我们试试asfreqgroupby

v = df.asfreq('W', method='ffill')
v /= v.groupby(v.index.strftime('%Y-%m')).transform('count')

                  qty
PERIOD_NAME          
2017-09-03   12460.50
2017-09-10   12460.50
2017-09-17   12460.50
2017-09-24   12460.50
2017-10-01    5455.00
2017-10-08    5455.00
2017-10-15    5455.00
2017-10-22    5455.00
2017-10-29    5455.00
2017-11-05    7289.75
2017-11-12    7289.75
2017-11-19    7289.75
2017-11-26    7289.75
2017-12-03   10268.80
2017-12-10   10268.80
2017-12-17   10268.80
2017-12-24   10268.80
2017-12-31   10268.80
2018-01-07    4775.75
2018-01-14    4775.75
2018-01-21    4775.75
2018-01-28    4775.75
2018-02-04    5892.50
2018-02-11    5892.50
2018-02-18    5892.50
2018-02-25    5892.50
2018-03-04   11284.75
2018-03-11   11284.75
2018-03-18   11284.75
2018-03-25   11284.75
2018-04-01    5144.40
2018-04-08    5144.40
2018-04-15    5144.40
2018-04-22    5144.40
2018-04-29    5144.40

这很有效,因为您的值总是在每个月的第一天。或者,您可以使用

v /= v.groupby(v.qty).transform('count').values 

第二步。

【讨论】:

    【解决方案2】:

    您需要通过使用 cumsumgroupby 来稍微调整输出

    s=df.resample('W').mean()
    s.groupby(s.qty.notnull().cumsum()).qty.transform(lambda x : x.sum()/len(x))
    Out[166]: 
    PERIOD_NAME
    2017-09-03    12460.50
    2017-09-10    12460.50
    2017-09-17    12460.50
    2017-09-24    12460.50
    2017-10-01     5455.00
    2017-10-08     5455.00
    2017-10-15     5455.00
    2017-10-22     5455.00
    2017-10-29     5455.00
    2017-11-05     7289.75
    2017-11-12     7289.75
    2017-11-19     7289.75
    2017-11-26     7289.75
    2017-12-03    10268.80
    2017-12-10    10268.80
    2017-12-17    10268.80
    2017-12-24    10268.80
    2017-12-31    10268.80
    2018-01-07     4775.75
    2018-01-14     4775.75
    2018-01-21     4775.75
    2018-01-28     4775.75
    2018-02-04     5892.50
    2018-02-11     5892.50
    2018-02-18     5892.50
    2018-02-25     5892.50
    2018-03-04    11284.75
    2018-03-11    11284.75
    2018-03-18    11284.75
    2018-03-25    11284.75
    2018-04-01     5144.40
    2018-04-08     5144.40
    2018-04-15     5144.40
    2018-04-22     5144.40
    2018-04-29     5144.40
    2018-05-06    22644.00
    Freq: W-SUN, Name: qty, dtype: float64
    

    【讨论】:

    • 我发帖的时候没看到这个。很好的答案(我也做过类似的事情)
    • @coldspeed 不用担心,因为我们有不同的想法 :-)
    猜你喜欢
    • 1970-01-01
    • 2016-08-06
    • 2013-07-01
    • 2021-06-01
    • 1970-01-01
    • 2019-02-28
    • 2019-07-02
    • 2018-04-25
    • 1970-01-01
    相关资源
    最近更新 更多