Ste*_*san 5 python performance datetime pandas pandas-groupby
我有一个熊猫数据框,其中包含以分钟为单位的外汇数据,为期一年(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
Run Code Online (Sandbox Code Playgroud)
我想过滤每日数据以获取一个小时范围:
dt = datetime(2017,1,1)
df_day = df1[df.index.date == dt.date()]
df_day_t = df_day.between_time('08:30', '09:30')
Run Code Online (Sandbox Code Playgroud)
如果我进行for200天循环,则需要几分钟。我怀疑这条线的每一步
df_day = df1[df.index.date == dt.date()]
Run Code Online (Sandbox Code Playgroud)
正在寻找数据集中每一行的相等性(即使它是有序数据集)。
有什么办法可以加快过滤速度,还是应该在for1月到12月之间做一些古老的命令式循环...?
datetime首先,您应该避免将Python datetime与Pandas操作结合使用。有很多Pandas / NumPy友好方法可以创建datetime对象进行比较,例如pd.Timestamp和pd.to_datetime。您的性能问题部分归因于docs中描述的此行为:
pd.Series.dt.date返回一个pythondatetime.date对象数组
object以这种方式使用dtype会消除矢量化的好处,因为操作随后需要Python级的循环。
groupby操作按日期汇总熊猫已经具有通过归一化时间按日期分组的功能:
for day, df_day in df.groupby(df.index.floor('d')):
df_day_t = df_day.between_time('08:30', '09:30')
# do something
Run Code Online (Sandbox Code Playgroud)
作为另一个示例,您可以通过以下方式访问特定日期的切片:
g = df.groupby(df.index.floor('d'))
my_day = pd.Timestamp('2017-01-01')
df_slice = g.get_group(my_day)
Run Code Online (Sandbox Code Playgroud)