首页 > 解决方案 > 我怎样才能加快我的熊猫日期时间切片?

问题描述

我有大量的秒级传感器数据,数十亿行跨越数天甚至数周。我也有一个事件的数万个开始和结束时间的列表,还有第二个。我正在尝试识别每个开始和结束时间内的传感器数据行,并在事件列中将该行标记为真,但速度非常慢。事件不能重叠。

我的尝试如下:

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

标签: pythonpandasdateoptimization

解决方案


通过将时间格式更改为自纪元以来的秒数,然后构建整数范围以索引时间而不是比较时间,我实现了 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

推荐阅读