Pandas 中缺失日期的移位时间序列
Shift time series with missing dates in Pandas
我有一个时间序列,其中缺少一些条目,看起来像这样:
date value
---------------
2000 5
2001 10
2003 8
2004 72
2005 12
2007 13
我想为 "previous_value" 创建一个专栏。但我只希望它连续多年显示价值。所以我希望它看起来像这样:
date value previous_value
-------------------------------
2000 5 nan
2001 10 5
2003 8 nan
2004 72 8
2005 12 72
2007 13 nan
然而,仅将 pandas 移位函数直接应用于列 'value' 将得到 'previous_value' = 10(对于 'time' = 2003,而 'previous_value' = 12 'time' = 2007.
在 pandas 中处理此问题的最优雅方法是什么? (我不确定它是否像设置 'freq' 属性一样简单)。
In [588]: df = pd.DataFrame({ 'date':[2000,2001,2003,2004,2005,2007],
'value':[5,10,8,72,12,13] })
In [589]: df['previous_value'] = df.value.shift()[ df.date == df.date.shift() + 1 ]
In [590]: df
Out[590]:
date value previous_value
0 2000 5 NaN
1 2001 10 5
2 2003 8 NaN
3 2004 72 8
4 2005 12 72
5 2007 13 NaN
另请参阅此处了解使用 resample()
的时间序列方法:Using shift() with unevenly spaced data
您的示例看起来不像带有时间戳的实时序列数据。让我们再举一个缺少日期 2020-01-03
:
的例子
df = pd.DataFrame({"val": [10, 20, 30, 40, 50]},
index=pd.date_range("2020-01-01", "2020-01-05"))
df.drop(pd.Timestamp('2020-01-03'), inplace=True)
val
2020-01-01 10
2020-01-02 20
2020-01-04 40
2020-01-05 50
要移动一天,您可以将 freq
参数设置为 'D':
df.shift(1, freq='D')
输出:
val
2020-01-02 10
2020-01-03 20
2020-01-05 40
2020-01-06 50
要将原始数据与移动后的数据合并,您可以合并两个表:
df.merge(df.shift(1, freq='D'),
left_index=True,
right_index=True,
how='left',
suffixes=('', '_previous'))
输出:
val val_previous
2020-01-01 10 NaN
2020-01-02 20 10.0
2020-01-04 40 NaN
2020-01-05 50 40.0
您可以找到的其他偏移量别名here
我有一个时间序列,其中缺少一些条目,看起来像这样:
date value
---------------
2000 5
2001 10
2003 8
2004 72
2005 12
2007 13
我想为 "previous_value" 创建一个专栏。但我只希望它连续多年显示价值。所以我希望它看起来像这样:
date value previous_value
-------------------------------
2000 5 nan
2001 10 5
2003 8 nan
2004 72 8
2005 12 72
2007 13 nan
然而,仅将 pandas 移位函数直接应用于列 'value' 将得到 'previous_value' = 10(对于 'time' = 2003,而 'previous_value' = 12 'time' = 2007.
在 pandas 中处理此问题的最优雅方法是什么? (我不确定它是否像设置 'freq' 属性一样简单)。
In [588]: df = pd.DataFrame({ 'date':[2000,2001,2003,2004,2005,2007],
'value':[5,10,8,72,12,13] })
In [589]: df['previous_value'] = df.value.shift()[ df.date == df.date.shift() + 1 ]
In [590]: df
Out[590]:
date value previous_value
0 2000 5 NaN
1 2001 10 5
2 2003 8 NaN
3 2004 72 8
4 2005 12 72
5 2007 13 NaN
另请参阅此处了解使用 resample()
的时间序列方法:Using shift() with unevenly spaced data
您的示例看起来不像带有时间戳的实时序列数据。让我们再举一个缺少日期 2020-01-03
:
df = pd.DataFrame({"val": [10, 20, 30, 40, 50]},
index=pd.date_range("2020-01-01", "2020-01-05"))
df.drop(pd.Timestamp('2020-01-03'), inplace=True)
val
2020-01-01 10
2020-01-02 20
2020-01-04 40
2020-01-05 50
要移动一天,您可以将 freq
参数设置为 'D':
df.shift(1, freq='D')
输出:
val
2020-01-02 10
2020-01-03 20
2020-01-05 40
2020-01-06 50
要将原始数据与移动后的数据合并,您可以合并两个表:
df.merge(df.shift(1, freq='D'),
left_index=True,
right_index=True,
how='left',
suffixes=('', '_previous'))
输出:
val val_previous
2020-01-01 10 NaN
2020-01-02 20 10.0
2020-01-04 40 NaN
2020-01-05 50 40.0
您可以找到的其他偏移量别名here