我正在尝试将月度数据下采样到每周数据,并且有一个几个月的时间序列数据框,如下所示:
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' s)的填充,第一个值的偶数分割如下:
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
有没有一些方法可以使用重新采样,填充和插值来实现这个?
答案 0 :(得分:2)
您需要使用cumsum
groupby
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
答案 1 :(得分:2)
让我们试试asfreq
和groupby
。
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
第二步。