如何无需展开时序数据,基于其他列的时间范围过滤time-series?
无需展开时序数据,按指定时间范围过滤时序序列的方法
当然存在这类方法,不用展开时序数据,直接通过数组/序列的索引定位与切片操作,就能依据startTime和endTime列的时间范围过滤对应的时序序列。
原始数据
| timeSeries | ValueSeries | startTime | endTime |
|---|---|---|---|
| [t1, t2, t3, t4] | [1, 2, 3, 4 ] | t1 | t3 |
| [t1, t2, t3, t4] | [6, 7, 8, 9 ] | t2 | t4 |
预期结果
| timeSeries | ValueSeries | startTime | endTime |
|---|---|---|---|
| [t1, t2, t3] | [1, 2, 3] | t1 | t3 |
| [t2, t3, t4] | [7, 8, 9] | t2 | t4 |
具体实现方案
1. Python(Pandas)
通过apply遍历每行,定位起止时间点在时序数组中的索引,再对数组切片:
import pandas as pd # 构造数据集 df = pd.DataFrame({ 'timeSeries': [['t1','t2','t3','t4'], ['t1','t2','t3','t4']], 'ValueSeries': [[1,2,3,4], [6,7,8,9]], 'startTime': ['t1', 't2'], 'endTime': ['t3', 't4'] }) # 定义过滤逻辑 def filter_ts(row): start_idx = row['timeSeries'].index(row['startTime']) end_idx = row['timeSeries'].index(row['endTime']) + 1 # 切片左闭右开,需+1包含endTime对应元素 row['timeSeries'] = row['timeSeries'][start_idx:end_idx] row['ValueSeries'] = row['ValueSeries'][start_idx:end_idx] return row # 应用过滤 df = df.apply(filter_ts, axis=1)
2. SQL(PostgreSQL为例)
利用PostgreSQL的数组内置函数,定位索引后直接切片:
SELECT array_slice(timeSeries, array_position(timeSeries, startTime), array_position(timeSeries, endTime) - array_position(timeSeries, startTime) + 1) AS timeSeries, array_slice(ValueSeries, array_position(timeSeries, startTime), array_position(timeSeries, endTime) - array_position(timeSeries, startTime) + 1) AS ValueSeries, startTime, endTime FROM your_table;
核心思路是:找到时间范围端点在时序数组中的位置索引,直接对数组进行区间截取,全程无需将时序数据展开为多行,处理效率更高,尤其适合大规模时序数据集。
内容的提问来源于stack exchange,提问作者AdiK
相关产品推荐
相关产品推荐

