我正在尝试将每月时间序列转换为年度范围而不更改值。
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
我想念什么?
答案 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