如何使用 Python/pandas 从此 csv 中获取 5 分钟数据? 对于每 5 分钟的间隔,我尝试获取该 5 分钟间隔的日期、时间、开盘价、最高价、最低价、收盘价、成交量。
DATE TIME OPEN HIGH LOW CLOSE VOLUME
02/03/1997 09:04:00 3046.00 3048.50 3046.00 3047.50 505
02/03/1997 09:05:00 3047.00 3048.00 3046.00 3047.00 162
02/03/1997 09:06:00 3047.50 3048.00 3047.00 3047.50 98
02/03/1997 09:07:00 3047.50 3047.50 3047.00 3047.50 228
02/03/1997 09:08:00 3048.00 3048.00 3047.50 3048.00 136
02/03/1997 09:09:00 3048.00 3048.00 3046.50 3046.50 174
02/03/1997 09:10:00 3046.50 3046.50 3045.00 3045.00 134
02/03/1997 09:11:00 3045.50 3046.00 3044.00 3045.00 43
02/03/1997 09:12:00 3045.00 3045.50 3045.00 3045.00 214
02/03/1997 09:13:00 3045.50 3045.50 3045.50 3045.50 8
02/03/1997 09:14:00 3045.50 3046.00 3044.50 3044.50 152
df.resample
基于日期/时间变量进行聚合。您需要一个日期时间索引,并且可以在读取 csv 文件时指定该索引:
df = pd.read_csv("filename.csv", parse_dates = [["DATE", "TIME"]], index_col=0)
这将产生一个带有日期和时间组合索引的数据框(源):
df.head()
Out[7]:
OPEN HIGH LOW CLOSE VOLUME
DATE_TIME
1997-02-03 09:04:00 3046.0 3048.5 3046.0 3047.5 505
1997-02-03 09:05:00 3047.0 3048.0 3046.0 3047.0 162
1997-02-03 09:06:00 3047.5 3048.0 3047.0 3047.5 98
1997-02-03 09:07:00 3047.5 3047.5 3047.0 3047.5 228
1997-02-03 09:08:00 3048.0 3048.0 3047.5 3048.0 136
之后,您可以使用重新采样来获取这五分钟间隔的总和、平均值等。
df.resample("5T").mean()
Out[8]:
OPEN HIGH LOW CLOSE VOLUME
DATE_TIME
1997-02-03 09:00:00 3046.0 3048.5 3046.0 3047.5 505.0
1997-02-03 09:05:00 3047.6 3047.9 3046.8 3047.3 159.6
1997-02-03 09:10:00 3045.6 3045.9 3044.8 3045.0 110.2
1997-02-03 09:15:00 3043.6 3044.0 3042.8 3043.2 69.2
1997-02-03 09:20:00 3044.7 3045.2 3044.5 3045.0 65.8
1997-02-03 09:25:00 3043.8 3044.0 3043.5 3043.7 59.0
1997-02-03 09:30:00 3044.6 3045.0 3044.3 3044.6 56.0
1997-02-03 09:35:00 3044.5 3044.5 3043.5 3044.5 44.0
(T用于分钟频率。这里是其他单位的列表。)
对马库斯的答案稍作修改。它分组并将其分配给最后一个索引
df_close_left = data_set.groupby(pd.Grouper(freq='5Min',closed='right',label='right')).agg({
"open": "first",
"high": "max",
"low": "min",
"close": "last",
"volume": "sum"
})
使用
pandas
的另一种方法是使用其 TimeGrouper
函数。
它的目的仅适用于像您这样的用例。
import pandas as pd
df = pd.DataFrame("Your data provided above")
df["DATE"] = pd.to_datetime(df["DATE"])
df.set_index("DATE", inplace=True)
df = df.groupby(pd.TimeGrouper('5Min')).agg({
"OPEN": "first",
"HIGH": "max",
"LOW": "min",
"CLOSE": "last",
"VOLUME": "sum"
})
提供的脚本使用您在处理股票数据时可能想到的聚合。它以某种方式聚合,最终您将得到 1 分钟蜡烛所产生的 5 分钟蜡烛。
我发现一个非常有效的简单解决方案,并且可以调整以用于多个时间范围分组(检查 Pandas 文档以获取频率别名)是:
import pandas as pd
historical_data = pd.read_csv('your_file.csv.gz', engine='pyarrow', compression='gzip')
historical_data['timestamp'] = pd.to_datetime(historical_data['timestamp'])
historical_data = historical_data.set_index('timestamp')
historical_data.index = historical_data.index.floor('5min')
historical_data = historical_data.reset_index()
historical_data = historical_data.groupby(['timestamp', 'symbol']).agg({'open': ['first'],
'high': ['max'],
'low': ['min'],
'close': ['last'],
'volume': ['sum'],
'turnover': ['sum']
})
historical_data.columns = ['open', 'high', 'low', 'close', 'volume', 'turnover']