使用pandas.io.data.DataReader类,我可以直接从在线数据源(如FRED)读取:
import datetime
import pandas.io.data
t1 = datetime.datetime(1960, 1, 1)
t2 = datetime.datetime(2014, 6, 1)
gdp = pandas.io.data.DataReader("GDPC96", "fred", t1, t2)
print(gdp.tail())
这将正确获取数据:
^{pr2}$但是,这些数据实际上没有任何与之相关的频率,所以gdp.index.freq
只是None
。由于某些原因,我无法使用gdp.asfreq("Q")
设置频率,可能是因为日期是每个季度第一个月的第一天,而不是最后一个月的最后一天。如果我试试这个:
print(gdp.asfreq("Q").tail())
我明白了:
GDPC96
2013-03-31 NaN
2013-06-30 NaN
2013-09-30 NaN
2013-12-31 NaN
2014-03-31 NaN
我唯一的选择是在下载后以某种方式重新映射日期,还是有一种方法可以直接使用正确的频率下载这些数据,例如通过指定日期范围(t = pandas.date_range(t1, t2, freq="Q")
)?在
现在我用这个方法:
import datetime
import pandas.io.data
import scipy
t1 = datetime.datetime(1960, 1, 1)
t2 = datetime.datetime(2014, 6, 1)
t = pandas.date_range(t1, t2 + datetime.timedelta(days=32), freq="Q")
gdp = pandas.io.data.DataReader("GDPC96", "fred", t1, t2)
print(gdp.tail())
gdp.index = t
print(gdp.tail())
正确执行映射:
GDPC96
DATE
2013-04-01 15606.591
2013-07-01 15779.938
2013-10-01 15916.208
2014-01-01 15831.652
2014-04-01 16010.405
GDPC96
2013-06-30 15606.591
2013-09-30 15779.938
2013-12-31 15916.208
2014-03-31 15831.652
2014-06-30 16010.405
但我觉得应该有一个标准的方法(也许就是这样),因为这可能是一个常见的操作。在
更新:根据答案,我使用了以下代码:
import datetime
import pandas.io.data
import pandas.tseries.offsets
t1 = datetime.datetime(1960, 1, 1)
t2 = datetime.datetime(2014, 6, 1)
gdp = pandas.io.data.DataReader("GDPC96", "fred", t1, t2)
gdp.index += pandas.tseries.offsets.QuarterEnd()
当我在Spyder(或从命令行)中运行它时,会出现一个错误:
Traceback (most recent call last):
File "<ipython-input-1-0ac9a29f7f6a>", line 1, in <module>
runfile('C:\folder\plots.py', wdir='C:\folder')
File "C:\Anaconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 585, in runfile
execfile(filename, namespace)
File "C:\Anaconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 48, in execfile
exec(compile(open(filename, 'rb').read(), filename, 'exec'), namespace)
File "C:/folder/plots", line 10, in <module>
gdp.index += pandas.tseries.offsets.QuarterEnd()
File "C:\Anaconda3\lib\site-packages\pandas\core\index.py", line 950, in __add__
return Index(self.view(np.ndarray) + other)
TypeError: ufunc add cannot use operands with types dtype('<M8[ns]') and dtype('O')
我认为你的方法是最好的。在熊猫0.15版或 更新,你可以用
结果是
^{pr2}$在版本0.14中,可以使用
相反。在
相关问题 更多 >
编程相关推荐