2017-08-02 99 views
1

我有不同的切片值以下DF跨越时间:我如何计算熊猫在周内的变化?

date  A B C 
0 2016-01-01 5 7 2 
1 2016-01-02 6 12 15 
... 
2 2016-01-08 9 5 16 
... 
3 2016-12-24 5 11 13 
4 2016-12-31 3 52 22 

我想创建一个新的数据帧,计算在每个切片的W-W的变化,按日期。例如,我希望新表对于jan 1 - jan 7中的所有切片是空白的。我希望jan 8的值为给定切片的jan 8值减去该切片的jan 1值。然后,我希望jan 9的值是给定切片的jan 9值减去jan 2切片的值。一直下降。

示例表是这样的:

date  A B C 
0 2016-01-01 0 0 0 
1 2016-01-02 0 0 0 
... 
2 2016-01-08 4 -2 14 
... 
3 2016-12-24 4 12 2 
4 2016-12-31 -2 41 9 

你可以假设的偏移量始终7.换句话说,有没有缺少的日期。

+1

可以重组你的数据帧就像他们在Python的控制台? – DJK

+0

@ djk47463 - 全部设置。 –

回答

1

如果我们知道偏移量始终7然后用shift(),这里是展示它是如何工作的一个简单的例子:

df = pandas.DataFrame({'x': range(30)}) 
df.shift(7) 
     x 
0 NaN 
1 NaN 
2 NaN 
3 NaN 
4 NaN 
5 NaN 
6 NaN 
7 0.0 
8 1.0 
9 2.0 
10 3.0 
11 4.0 
12 5.0 
... 

所以有了这个,你可以这样做:

df - df.shift(7) 
     x 
0 NaN 
1 NaN 
2 NaN 
3 NaN 
4 NaN 
5 NaN 
6 NaN 
7 7.0 
8 7.0 
... 

在你的情况,之前不要忘记set_index('date')

1

@ Unatiel的答案在这种情况下是正确的,在这种情况下,没有缺失的日期,应该被接受。

但是我想在这里为缺失日期的案例发布修改,对于任何感兴趣的人。从docs

shift方法接受freq参数,它可以接受 DateOffset类或其它timedelta样物体或者也可以是偏移 别名

from pandas.tseries.offsets import Week 
res = ((df - df.shift(1, freq=Week()).reindex(df.index)) 
     .fillna(value=0) 
     .astype(int)) 

print(res) 
      A B 
date    
2016-01-01 0 0 
2016-01-02 0 0 
2016-01-03 0 0 
2016-01-04 0 0 
2016-01-05 0 0 
2016-01-06 0 0 
2016-01-07 0 0 
2016-01-08 31 46 
2016-01-09 4 20 
2016-01-10 -51 -65 
2016-01-11 56 5 
2016-01-12 -51 24 
     .. .. 
2016-01-20 34 -30 
2016-01-21 -28 19 
2016-01-22 24 8 
2016-01-23 -28 -46 
2016-01-24 -11 -60 
2016-01-25 -34 -7 
2016-01-26 -12 -28 
2016-01-27 -41 42 
2016-01-28 -2 48 
2016-01-29 35 -51 
2016-01-30 -8 62 
2016-01-31 -6 -9