在pandas数据框中将单个列向前移动几个日期

3

我想将以下数据框中 val 列的所有值向前移动3天:

datetime    val val_b
12/20/2010      23
12/21/2010      12
12/22/2010  23  27
12/23/2010      26
12/24/2010      28
12/25/2010      17
12/26/2010      26
12/27/2010  21  14
12/28/2010      20
12/29/2010      18
12/30/2010  15  22
12/31/2010      20
1/1/2011        13
1/2/2011    12  30
1/3/2011        25
1/4/2011        15
1/5/2011        19
1/6/2011        14

我尝试使用 pd.DateOffset 函数,但它会将所有列向前移动,而我不希望这样。

df.val = df.val.shift(-3),这个对你的情况可行吗? - Naga kiran
1个回答

6

首先创建DatetimeIndex,然后使用带有参数freqshift

df['datetime'] = pd.to_datetime(df['datetime'])
df = df.set_index('datetime')

df['val'] = df['val'].shift(3, freq='d')
print (df)
             val  val_b
datetime               
2010-12-20   NaN     23
2010-12-21   NaN     12
2010-12-22   NaN     27
2010-12-23   NaN     26
2010-12-24   NaN     28
2010-12-25  23.0     17
2010-12-26   NaN     26
2010-12-27   NaN     14
2010-12-28   NaN     20
2010-12-29   NaN     18
2010-12-30  21.0     22
2010-12-31   NaN     20
2011-01-01   NaN     13
2011-01-02  15.0     30
2011-01-03   NaN     25
2011-01-04   NaN     15
2011-01-05  12.0     19
2011-01-06   NaN     14

1
谢谢@jezrael,df['val'].shift(3, freq='d')的末尾应该加上.values吗? - user308827
@user308827 - 如果没有.values,它匹配得不正确吗? - jezrael
1
我收到了这个错误:*** ValueError: cannot reindex from a duplicate axis - user308827
1
@user308827 - 我测试了一下,.values 对我来说没有移动数据。存在重复的日期时间确实存在问题,可能的黑客解决方案是 `df.index = [df.index, df.groupby('datetime').cumcount()]df = df.unstack() df['val'] = df['val'].shift(3, freq='d') df = df.stack().reset_index(level=1, drop=True)` - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接