python - 我怎样才能加快我的熊猫日期时间切片?
问题描述
我有大量的秒级传感器数据,数十亿行跨越数天甚至数周。我也有一个事件的数万个开始和结束时间的列表,还有第二个。我正在尝试识别每个开始和结束时间内的传感器数据行,并在事件列中将该行标记为真,但速度非常慢。事件不能重叠。
我的尝试如下:
sensor_data = pd.DataFrame( columns = ["Event"], index =
pd.date_range("2018-01-01", periods=15, freq="s"))
event_data = pd.DataFrame(data = {"Start":["2018-01-01 00:00:01","2018-01-01 00:00:08"],
"End":["2018-01-01 00:00:03","2018-01-01 00:00:12"]})
sensor_data["Event"] = 0
event_data["Start"] = pd.to_datetime(event_data["Start"],utc=True)
event_data["End"] = pd.to_datetime(event_data["End"],utc=True)
for i in range(event_data.shape[0]):
start = event_data["Start"].iloc[i]
end = event_data["End"].iloc[i]
event_indexes = sensor_data.loc[start:end].index
sensor_data.loc[event_indexes,"Event"] = 1
解决方案
通过将时间格式更改为自纪元以来的秒数,然后构建整数范围以索引时间而不是比较时间,我实现了 200 倍的加速。我在下面使用的代码作为参考。
event_data["Start"] = pd.to_datetime(event_data["Start"],utc=True)//1e9
event_data["End"] = pd.to_datetime(event_data["End"],utc=True)//1e9
ranges = []
for row_index, row in event_data.iterrows():
ranges.append(np.arange(event_data["VisitStart"].iloc[row_index],event_data["VisitEnd"].iloc[row_index]))
sensor_data.loc[ranges,"event"] = 1
推荐阅读
- django - 形式和模型之间的循环依赖
- php - MySQL没有将转义字符转换为原始字符串
- kotlin - 持久性.CordaPersistence。- 清理任务失败:[errorCode=1d5efik, moreInformationAt=https://errors.corda.net/OS/4.4/1d5efik]
- r - r中的随机效应模型
- python - 为什么我没有得到相同的结果?这两个代码不是表示相同的东西吗?
- r - R中的逻辑回归以获得SNP列表以获得汇总统计信息
- azure - Azure 功能 - 有机会通过 apt-get 安装软件包吗?
- java - 如何在基于 PKCS11 的 SafeNet HSM 中生成具有脑池曲线的 ECDSA 密钥?
- asp.net-mvc - 输入类型文件需要在流利的验证中验证
- amazon-web-services - awscli 并根据时间戳将文件移动到 s3 存储桶