2016-06-28 102 views
1

我试图找到是否可以使用data.asfreq(MonthEnd())没有date_range创建的数据。 我正在努力实现。我运行下面的代码CSV查询:熊猫频率转换

import numpy as np 
import pandas as pd 
data = pd.read_csv("https://www.quandl.com/api/v3/datasets/FRED/GDPC1.csv?api_key=", parse_dates=True) 
data.columns = ["period", "integ"] 
data['period'] = pd.to_datetime(data['period'], infer_datetime_format=True) 

然后我想通过这样来分配频率,以我的“期间”栏:

tdelta = data.period[1] - data.period[0] 
data.period.freq = tdelta 

和一些打印系统管理命令:

print(data) 
print(data.period.freq) 
print(data.dtypes) 

退货:

.......... 
270 1948-07-01 2033.2 
271 1948-04-01 2021.9 
272 1948-01-01 1989.5 
273 1947-10-01 1960.7 
274 1947-07-01 1930.3 
275 1947-04-01 1932.3 
276 1947-01-01 1934.5 

[277 rows x 2 columns] 
-92 days +00:00:00 
period datetime64[ns] 
integ   float64 
dtype: object 

我还可以通过使“索引”解析原“日期”栏:

data = pd.read_csv("https://www.quandl.com/api/v3/datasets/FRED/GDPC1.csv?api_key=", parse_dates=True, index_col='DATE') 

我想要做的就是隐蔽在每月行的季度数据。例如:

270 1948-07-01 2033.2 
271 1948-06-01 NaN 
272 1948-05-01 NaN 
273 1948-04-01 2021.9 
274 1948-03-01 NaN 
275 1948-02-01 NaN 
276 1948-01-01 1989.5 
......and so on....... 

我终于尝试使用ts.asfreq(MonthBegin()),并ts.asfreq(MonthBegin(), method='pad')做到这一点。迄今为止失败。我有以下错误:

NameError: name 'MonthBegin' is not defined 

我的问题是我可以用asfreq如果我不使用date_range创建框架?以某种方式将我的日期栏传递给函数。如果这不是解决方案,是否有任何其他简单的方法将季度转换为每月频率?

+1

该错误消息的问题是什么...尝试'TS非常清楚.asfreq('M',how ='start',method ='pad')'。 –

+0

我应该在文档中看起来更好。我尝试了它,但它不会以任何方式更改该系列。它也不会导致任何错误。我尝试用'W'来改变'M'来查看是否有什么。一点也不。然而,当我将它更改为'MS'它说'TypeError:不能比较类型'时间戳'与'int'类型' – sretko

回答

2

使用TimeGrouper

import pandas as pd 

periods = ['1948-07-01', '1948-04-01', '1948-01-01', '1947-10-01', 
      '1947-07-01', '1947-04-01', '1947-01-01'] 
integs = [2033.2, 2021.9, 1989.5, 1960.7, 1930.3, 1932.3, 1934.5] 
df = pd.DataFrame({'period': pd.to_datetime(periods), 'integ': integs}) 
df = df.set_index('period') 

df = df.groupby(pd.TimeGrouper('MS')).sum().sort_index(ascending=False) 

编辑:您还可以使用resample代替TimeGrouper

df.resample('MS').sum().sort_index(ascending=False) 
+0

是否有任何方法可以将我的列传递给函数。例如'句号= data.period'和'integs = data.integ'。问题是他们有数百行。 – sretko

+0

如果我正确地理解你,用data = pd.read_csv(“...”,parse_dates = True,index_col ='DATE')'导入你的数据(如上所述),然后执行data.resample 'MS')。总和()。sort_index(升序=假)'。 –

+0

相同的变化。没有错误。代码现在看起来很简单'import pandas as pd data = pd.read_csv(“https://www.quandl.com/api/v3/datasets/FRED/GDPC1.csv?api_key=”,parse_dates = True,index_col ='DATE')'然后新函数'data.resample('MS')。sum()。sort_index(ascending = False)''。这是'print(data.dtypes)' - 'VALUE float64 dtype:object'的结果。没有任何适当的日期类型。如果没有实际频率,是否有可能进行“重采样”? – sretko