熊猫:时间序列的奇怪行为

时间:2019-12-16 07:09:02

标签: python pandas time-series

我正在尝试将每月时间序列转换为年度范围而不更改值。

import pandas as pd
df = pd.read_csv(url_inflation, delimiter='\t')
df.head()

    date    value
0   2019-09 -0.0016
1   2019-08 -0.0024
2   2019-07 0.0020
3   2019-06 0.0004
4   2019-05 0.0034

然后将日期列转换为日期时间格式,并将其设置为索引:

df['date'] = pd.to_datetime(df.date, yearfirst=True, format='%Y-%m')

df.set_index('date', inplace=True)

看起来索引正确:

df.info()

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 345 entries, 2019-09-01 to 1991-01-01
Data columns (total 1 columns):
value    345 non-null float64
dtypes: float64(1)
memory usage: 5.4 KB

当我使用asfreq时,它会输出带有DatetimeIndex的空DataFrame:

df.asfreq(freq='A')

date    value

df.asfreq(freq='A').info()
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 0 entries
Freq: A
Data columns (total 2 columns):
date     0 non-null object
value    0 non-null float64
dtypes: float64(1), object(1)
memory usage: 0.0+ bytes

使用groupby时似乎正常工作:

df1=df.groupby(pd.Grouper(level='date', freq='A')).nth(11)
df1.tail()

date        value
2014-12-31  0.0262
2015-12-31  0.0077
2016-12-31  0.0040
2017-12-31  0.0042
2018-12-31  0.0084

我想念什么?

1 个答案:

答案 0 :(得分:0)

我认为您需要先使用asfreq()对索引进行排序。

尝试:

df = df.sort_index().asfreq(freq='A')

或者:使用resample()

df = df.resample('A').asfreq()

使用freq='AS'作为年初。

EDIT1:

您还可以使用.agg().resample()来获得预期的结果。

df = df.resample('AS').agg('sum')

输出:

             value
date              
2017-01-01  3.0018
2018-01-01  2.0018
2019-01-01  1.0018