我正在尝试处理这样的CSV文件:
df = pd.read_csv("raw_hl.csv", index_col='time', parse_dates = True))
df.head(2)
high low
time
2014-01-01 17:00:00 1.376235 1.375945
2014-01-01 17:01:00 1.376005 1.375775
2014-01-01 17:02:00 1.375795 1.375445
2014-01-01 17:07:00 NaN NaN
...
2014-01-01 17:49:00 1.375645 1.375445
type(df.index)
pandas.tseries.index.DatetimeIndex
Run Code Online (Sandbox Code Playgroud)
但这些并不会自动产生频率:
print df.index.freq
None
Run Code Online (Sandbox Code Playgroud)
如果它们具有不同的频率,则能够自动设置一个是很方便的.最简单的方法是比较前两行:
tdelta = df.index[1] - df.index[0]
tdelta
datetime.timedelta(0, 60)
Run Code Online (Sandbox Code Playgroud)
到目前为止一直很好,但直接设置频率到这个时间点失败:
df.index.freq = tdelta
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-25-3f24abacf9de> in <module>()
----> 1 df.index.freq = tdelta
AttributeError: can't set attribute
Run Code Online (Sandbox Code Playgroud)
有没有办法(理想情况下相对无痛!)这样做?
答案:Pandas已经给出了dataframe有一个index.inferred_freq属性 - 可能是为了避免覆盖用户定义的频率.df.index.inferred_freq ='T'
所以它似乎只是使用它而不是df.index.freq.感谢Jeff,他还提供了更多详细信息:)
Jef*_*eff 11
如果您有常规频率,则会在您查看时报告df.index.freq
In [20]: df = DataFrame({'A' : np.arange(5)},index=pd.date_range('20130101 09:00:00',freq='3T',periods=5))
In [21]: df
Out[21]:
A
2013-01-01 09:00:00 0
2013-01-01 09:03:00 1
2013-01-01 09:06:00 2
2013-01-01 09:09:00 3
2013-01-01 09:12:00 4
In [22]: df.index.freq
Out[22]: <3 * Minutes>
Run Code Online (Sandbox Code Playgroud)
有不规则的频率会返回None
In [23]: df.index = df.index[0:2].tolist() + [Timestamp('20130101 09:05:00')] + df.index[-2:].tolist()
In [24]: df
Out[24]:
A
2013-01-01 09:00:00 0
2013-01-01 09:03:00 1
2013-01-01 09:05:00 2
2013-01-01 09:09:00 3
2013-01-01 09:12:00 4
In [25]: df.index.freq
Run Code Online (Sandbox Code Playgroud)
这样做可以恢复常规频率.下采样到较低的频率(没有重叠值),前向填充,然后重新索引到所需的频率和终点).
In [31]: df.resample('T').ffill().reindex(pd.date_range(df.index[0],df.index[-1],freq='3T'))
Out[31]:
A
2013-01-01 09:00:00 0
2013-01-01 09:03:00 1
2013-01-01 09:06:00 2
2013-01-01 09:09:00 3
2013-01-01 09:12:00 4
Run Code Online (Sandbox Code Playgroud)