我有一个索引数据的每日时间序列,并希望对其进行每年的 pct 更改。如果我使用 DataFrame.pct_change(periods=...)
我将不得不定义到去年同一天的确切天数,这是不正确的,因为工作日数每年都不同。有谁知道如何从一年前的同一天获取更改?
代码可能如下所示:
import pandas as pd
list=[]
list=[[7.71],[7.79],[6.80],[6.44],[6.46],[6.80]]
df = pd.DataFrame(list, columns=['index'], index=['2016-01-04','2016-01-05','2016-01-06','2017-01-04','2017-01-05','2017-01-06'])
我希望输出如下:
2017-01-04 -16.45%
2017-01-05 -17.10%
2017-01-05 0.00%
答案 0 :(得分:0)
首先,一些建议:
list
作为列表名称,因为您会覆盖内置的 list
。index
作为列名,因为在 Pandas 中 index
包含行标识。此外,这可能会令人困惑,因为您可以使用 df.column_name
访问列,但在这种情况下这是不可能的,因为 df.index
包含数据帧索引。pandas.DateTimeIndex
。l = [7.71, 7.79, 6.80, 6.44, 6.46, 6.80]
index = pd.DatetimeIndex(['2016-01-04', '2016-01-05', '2016-01-06',
'2017-01-04' ,'2017-01-05' ,'2017-01-06'])
df = pd.DataFrame(l, columns=['col'], index = index)
现在,您可以将 pandas.DataFrame.pct_change
与 pandas.DateOffset
对象一起使用:
do = pd.DateOffset(years = 1)
df.pct_change(freq = do).dropna().mul(100)
输出
index
2017-01-04 -16.472114
2017-01-05 -17.073171
2017-01-06 0.000000
答案 1 :(得分:-1)
EDIT:从@Pablo C 的好答案开始:鉴于 OP 对 DataFrame 的定义,我们首先需要将索引转换为 DatetimeIndex
,否则 @Pablo C 的答案将抛出NotImplementedError: Not supported for type Index
import pandas as pd
list=[]
list=[[7.71],[7.79],[6.80],[6.44],[6.46],[6.80]]
df = pd.DataFrame(list, columns=['index'], index=['2016-01-04','2016-01-05','2016-01-06','2017-01-04','2017-01-05','2017-01-06'])
df.index = pd.to_datetime(df.index)
do = pd.DateOffset(years = 1)
df.pct_change(freq = do).dropna().mul(100)
# index
# 2017-01-04 -16.472114
# 2017-01-05 -17.073171
# 2017-01-06 0.000000