python - 按天过滤熊猫数据框
问题描述
我有一个熊猫数据框,其中包含按分钟计算的外汇数据,长达一年(371635 行):
O H L C
0
2017-01-02 02:00:00 1.05155 1.05197 1.05155 1.05190
2017-01-02 02:01:00 1.05209 1.05209 1.05177 1.05179
2017-01-02 02:02:00 1.05177 1.05198 1.05177 1.05178
2017-01-02 02:03:00 1.05188 1.05200 1.05188 1.05200
2017-01-02 02:04:00 1.05196 1.05204 1.05196 1.05203
我想过滤每日数据以获得一个小时范围:
dt = datetime(2017,1,1)
df_day = df1[df.index.date == dt.date()]
df_day_t = df_day.between_time('08:30', '09:30')
如果我进行for
200 天的循环,则需要几分钟。我怀疑在每一步这条线
df_day = df1[df.index.date == dt.date()]
正在寻找数据集中每一行的相等性(即使它是一个有序的数据集)。
有什么办法可以加快过滤速度,或者我应该for
从一月到十二月做一些旧的命令循环......?
解决方案
避免使用 Pythondatetime
首先,您应该避免将 Pythondatetime
与 Pandas 操作结合使用。有许多 Pandas / NumPy 友好的方法可以创建datetime
用于比较的对象,例如pd.Timestamp
和pd.to_datetime
. 您在这里的性能问题部分是由于文档中描述的这种行为:
pd.Series.dt.date
datetime.date
返回一个 Python对象数组
以这种方式使用object
dtype 消除了矢量化的好处,因为操作需要 Python 级循环。
使用groupby
按日期聚合的操作
Pandas 已经具有通过标准化时间按日期分组的功能:
for day, df_day in df.groupby(df.index.floor('d')):
df_day_t = df_day.between_time('08:30', '09:30')
# do something
作为另一个示例,您可以通过以下方式访问特定日期的切片:
g = df.groupby(df.index.floor('d'))
my_day = pd.Timestamp('2017-01-01')
df_slice = g.get_group(my_day)
推荐阅读
- javascript - 将自定义标记添加到 Mapbox 地图
- java - 创建对象时如何增加对象数组?
- javascript - 将内容日期和时间作为字符串而不是数字返回
- csv - Netezza 将 csv 作为空表导入
- python - Python LMFIT - 使用有界参数时得到错误的最小化结果
- spock - 如何在geb spock中进行鼠标悬停
- apache-spark - GCP Dataproc:使用存储连接器的网络带宽不佳
- angular - 与 [(ngModel)] 绑定的条件表达式
- java - 带有德语区域设置的 SimpleDateFormat - Java 8 与 Java 10+
- sql-server - 通过变量计算不同月份 - SSIS