我有一个具有以下结构的数据框。 (system_time是索引)
+---------------------+------+------+------+
| System_Time(index) | var1 | var2 | var3 |
+---------------------+------+------+------+
| 2017-03-28 04:24:00 | 4 | 1 | 2 |
| 2017-03-28 04:32:00 | 5 | 4 | 453 |
| 2017-03-28 04:40:00 | 6 | 21 | 2 |
| 2017-03-28 04:48:00 | 2 | 9 | 5 |
| 2017-03-28 04:56:00 | 5 | 1 | 1 |
| 2017-03-28 05:04:00 | 1 | 2 | 2 |
| 2017-03-28 05:12:00 | 8 | 5 | 2 |
+---------------------+------+------+------+
我的目标是循环选择时间。示例:我想要获取介于2017-03-28 04:24:00和2017-03-28 04:24:00之间的所有行。
当前,我使用dataset.loc[start_date:end_date]
(可完成这项工作。)
然后,我将时间增加8分钟(开始日期和结束日期)以获取下一个选择。 (开始日期和结束日期之间的54分钟一致间隔)
对于每个选择,我将每一列的总和,均值或第一位作为单行(简单的数据框函数)。之后,我执行插入查询以将其存储在数据库中。
问题:
大约有1500万条记录,用这种方法处理大约需要8个小时。
有什么想法可以改善性能吗?
答案 0 :(得分:0)
在Data Science SO论坛上似乎有一个similar problem described。
遵循那里的建议(关键是:使用rolling
函数):
df["System time"] = pd.to_datetime(df["System time"]) # Convert column type to be datetime
indexed_df = df.set_index(["System time"]) # Create a datetime index
indexed_df = dataset.loc[start_date:end_date]
indexed_df.rolling('480s') # Create rolling windows of 8m length
indexed_df.rolling('480s').mean() # Then apply functions to rolling windows (here: mean but you can use any lambda as in groupby)