Python 对间距不均匀的数据使用shift()

Python 对间距不均匀的数据使用shift(),python,pandas,Python,Pandas,希望这个例子能说明问题。我想用shift()创建“lagval”,但如果缺少上一年,则需要为nan df = DataFrame( { 'yr' : [2007,2008,2009,2011,2012], 'val': np.random.randn(5) } ) 期望输出(lagval): 我对此有一个不错的解决方案(作为答案发布),但我正在寻找替代方案。我花了一些时间研究了所有的时间序列函数,但这似乎有些过分了。似乎我最终会将年份转换为一个真正的时间戳,

希望这个例子能说明问题。我想用shift()创建“lagval”,但如果缺少上一年,则需要为nan

df = DataFrame( { 'yr' : [2007,2008,2009,2011,2012],
                  'val': np.random.randn(5) } )
期望输出(lagval):


我对此有一个不错的解决方案(作为答案发布),但我正在寻找替代方案。我花了一些时间研究了所有的时间序列函数,但这似乎有些过分了。似乎我最终会将年份转换为一个真正的时间戳,重新采样、移位,然后删除丢失的值。但也许有一种更简单的方法?

值得一提的是,这里有一个时间序列解决方案,显然需要更多的代码

df = df.set_index(df['yr'].apply(lambda x: datetime.datetime(x, 1, 1)))
df = df.resample('A').mean()

df['lagval'] = df['val'].shift(1)
df = df[pd.notnull(df['yr'])]

我不熟悉Stata,但只是浏览一下文档,听起来tsset做了一些类似的事情(将数据整合到指定的频率)?

谢谢,看到这种情况很好,并没有我想象的那么糟糕。Stata的tsset仅用于定义面板数据集的组和时间变量。之后,你可以延迟/重塑/等等,斯塔塔知道如何处理事情。有点像在大熊猫中堆叠之前设置索引。
df = df.set_index(df['yr'].apply(lambda x: datetime.datetime(x, 1, 1)))
df = df.resample('A').mean()

df['lagval'] = df['val'].shift(1)
df = df[pd.notnull(df['yr'])]