pandas检索时间序列的频率

时间:2013-12-20 20:07:37

标签: python pandas

有没有办法检索pandas中时间序列的频率?

rng = date_range('1/1/2011', periods=72, freq='H')
ts =pd.Series(np.random.randn(len(rng)), index=rng)

ts.frequency或ts.period不是可用的方法。

由于

修改 我们能否从时间序列中推断出未指定频率的频率?

import pandas.io.data as web
aapl = web.get_data_yahoo("AAPL")

<class 'pandas.tseries.index.DatetimeIndex'>
[2010-01-04 00:00:00, ..., 2013-12-19 00:00:00]
Length: 999, Freq: None, Timezone: None

我们能以某种方式获得aapl的频率吗?我们知道,这是工作日。

3 个答案:

答案 0 :(得分:13)

要推断频率,只需使用内置的fct'infer_freq'

import pandas as pd
pd.infer_freq(ts.index)

答案 1 :(得分:11)

DatetimeIndex

>>> rng
<class 'pandas.tseries.index.DatetimeIndex'>
[2011-01-01 00:00:00, ..., 2011-01-03 23:00:00]
Length: 72, Freq: H, Timezone: None
>>> len(rng)
72
>>> rng.freq
<1 Hour>
>>> rng.freqstr
'H'

与使用此索引编制索引的系列相似

>>> ts.index.freq
<1 Hour>

答案 2 :(得分:1)

@sweetdream 的回答实际上非常好,因为数据的频率并不总是作为索引的属性保留,所以如果没有指定,这将不起作用:

df.index.freq

@sweetdream 提到了 infer_freq 解决方案,这导致我再次对 Pandas 感到惊讶,它通过查看索引来推断频率。但有时它不起作用,还有另一种查找方式。

两者都应该有效:

text_freq_of_hourly_data_infer_freq = pd.infer_freq(df.index)
text_freq_of_hourly_data_inferred_freq = df.index.inferred_freq

它们都应该返回 'H',但如果数据框未排序,则推断将失败,并将返回 None,如文档中所述。所以你应该对索引进行排序。

并且不要忘记给它“索引”,而不是数据框,如果在索引中指定了它,它可以从列而不是索引中推断出来。

<块引用>

如果传递,则系列将使用系列的值(不是索引)。

参考文献:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DatetimeIndex.inferred_freq.html?highlight=infer_freq

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.infer_freq.html?highlight=infer_freq