以 5 分钟为间隔对 DataFrame 进行分组

新手上路,请多包涵

如何使用 Python/pandas 从这个 csv 中获取 5 分钟的数据?对于每 5 分钟的间隔,我试图获取该 5 分钟间隔的 DATE、TIME、OPEN、HIGH、LOW、CLOSE、VOLUME。

 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

原文由 Sam c21 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

您可以使用 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

之后,您可以使用 resample 来获取这五分钟间隔的总和、平均值等。

 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 用于分钟频率。 是其他单位的列表。)

原文由 ayhan 发布,翻译遵循 CC BY-SA 3.0 许可协议

另一种使用 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 分钟蜡烛图。

原文由 Markus 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题