Python熊猫时间序列操作

时间:2017-01-28 11:32:00

标签: python pandas time-series resampling

我有一个pandas数据帧,结构如下:

                     Date     Open     High      Low    Close  Volume
0     2003-10-01 00:00:00  1.16500  1.16700  1.16400  1.16690    1125
1     2003-10-01 01:00:00  1.16680  1.16790  1.16600  1.16720     933
............

这些是连续时间值,因为它是Eur / Usd数据。 我想重新采样这个创建一个每日数据帧,使用Open XXX中的值为Date XXXX-XX-XX 09:00:00的Open列,而Close值为XXXX-XX-XX 16:00:00的Close列值。高和低应该是XXXX-XX-XX 09:00:00和XXXX-XX-XX 16:00:00之间的较高和较低的低。 音量应该是XXXX-XX-XX 09:00:00和XXXX-XX-XX 16:00:00之间音量的总和。 在熊猫中有一种简单的方法吗? 怎么样?

由于

3 个答案:

答案 0 :(得分:1)

这是一个两步过程。首先,您需要删除超出每日每小时限制的数据;然后你需要重新采样到每日频率。

假设这是我们的时间序列:

import pandas as pd
import numpy as np
ts = pd.Series(np.random.random(72), index=pd.date_range('1/1/2011', periods=72, freq='H'))

要按小时过滤,我们可以创建一个布尔数组,询问我们数据中的每个时间戳,无论其小时数是否在我们感兴趣的小时内,然后用它来索引我们的时间序列:

ts_filtered = ts[ts.index.map(lambda time: 9 <= time.hour <= 17)]

然后,要重新取样,只需使用resample

daily_stats = ts_filtered.resample('D').mean()

哪个让我们:

2011-01-01    0.507943
2011-01-02    0.416317
2011-01-03    0.573760
Freq: D, dtype: float64

答案 1 :(得分:1)

谢谢,我也找到了这个解决方案:

ohlc_dict = {                                                                                                             
'Open':'first',                                                                                                    
'High':'max',                                                                                                       
'Low':'min',                                                                                                        
'Close': 'last',                                                                                                    
'Volume': 'sum'  }

df_filtered_daily = df_filtered.resample('D', how=ohlc_dict, closed='left', label='left')

答案 2 :(得分:1)

仅在09:00:00至16:00:00之间。

sf::Texture::~Texture()是获得所需时间的简单方法

between_time
使用推荐的语法

重新采样

并且为了避免执行ts = ts.between_time('9:00','16:00') 时出现“未来警告”,请尝试以下操作:

resample