Python 将时间间隔转换为日期时间

Python 将时间间隔转换为日期时间,python,pandas,datetime,time-series,intervals,Python,Pandas,Datetime,Time Series,Intervals,我有一个数据帧,其中包含某个传感器处于活动状态的时间间隔: start end 0 2018-06-01 08:55:10 2018-06-01 09:01:00 1 2018-06-01 09:02:20 2018-06-01 09:04:55 2 2018-06-01 09:11:35 2018-06-01 09:23:44 我想对这些数据做一些时间序列分析。为此,我想将此数据转换为一个适当的时间序列,该序列每X分钟有

我有一个数据帧,其中包含某个传感器处于活动状态的时间间隔:

                 start                 end
0  2018-06-01 08:55:10 2018-06-01 09:01:00
1  2018-06-01 09:02:20 2018-06-01 09:04:55
2  2018-06-01 09:11:35 2018-06-01 09:23:44
我想对这些数据做一些时间序列分析。为此,我想将此数据转换为一个适当的时间序列,该序列每
X
分钟有一个时间戳。以下是
X=5
min的示例:

                 time active
0 2018-06-01 08:55:10      1
1 2018-06-01 09:00:10      1
2 2018-06-01 09:05:10      0
3 2018-06-01 09:10:10      1
如果传感器在间隔
[t,t+X]
内处于活动状态,则可以将上述内容解读为“
活动==1

请注意,间隔并不总是不相交的

目前,我正在将间隔转换为
DatetimeIndex
,频率为
X
min。之后,我将再次对序列进行重新采样(考虑重叠间隔):

我的数据集大约有1500万个条目。上述操作需要相当长的时间才能运行。我想做得更好


有人有好主意吗?

如果间隔是不相交的,并且行被排序(假设只有一个传感器和顺序数据),就像在您的示例中一样,您可以执行简单的循环并逐行检查

例如:

import pandas as pd
import numpy as np

# Create your dataframe
x = np.array([
    ['2018-06-01 08:55:10', '2018-06-01 09:01:00'],
    ['2018-06-01 09:02:20', '2018-06-01 09:04:55'],
    ['2018-06-01 09:11:35', '2018-06-01 09:23:44']
    ])

df = pd.DataFrame(x, columns=['start', 'end'])
df['start'] = pd.to_datetime(df['start'])
df['end'] = pd.to_datetime(df['end'])
print(df)
数据帧:

     start                 end
0 2018-06-01 08:55:10 2018-06-01 09:01:00
1 2018-06-01 09:02:20 2018-06-01 09:04:55
2 2018-06-01 09:11:35 2018-06-01 09:23:44
生成结果的代码:

results = []
interval = pd.Timedelta('5 minutes') # interval X
start = pd.to_datetime('2018-06-01 08:55:10')

time = start
# iterate each sensor interval
# must be sorted by time, and no intervals should overlap
for (i, row) in df.iterrows():
    # go to the next interval when time is after current interval
    while time < row['end']:
        if time >= row['start']:
            results.append([time, 1])
        else:
            results.append([time, 0])
        time += interval

result_df = pd.DataFrame(results, columns=['time', 'active'])
result_df['time'] = pd.to_datetime(result_df['time'])
print(result_df)

15米的行需要几秒钟的时间。

如果您发布一个编码尝试,然后询问如何使其(a)正确或(b)矢量化,我想您会从堆栈溢出社区获得更好的支持。所有间隔都是不相交的吗?我添加了一个我现在正在做的代码片段。不幸的是,我的间隔不是不相交的。如果同时有两个或多个传感器处于活动状态,会发生什么?活动应该仍然是1吗?@klaus完全正确,因为重叠的间隔
active
仍然是1。非常感谢您的回复,@klaus!这是一个很好的方法。不幸的是,我的间隔不是不相交的。
results = []
interval = pd.Timedelta('5 minutes') # interval X
start = pd.to_datetime('2018-06-01 08:55:10')

time = start
# iterate each sensor interval
# must be sorted by time, and no intervals should overlap
for (i, row) in df.iterrows():
    # go to the next interval when time is after current interval
    while time < row['end']:
        if time >= row['start']:
            results.append([time, 1])
        else:
            results.append([time, 0])
        time += interval

result_df = pd.DataFrame(results, columns=['time', 'active'])
result_df['time'] = pd.to_datetime(result_df['time'])
print(result_df)
                 time  active
0 2018-06-01 08:55:10       1
1 2018-06-01 09:00:10       1
2 2018-06-01 09:05:10       0
3 2018-06-01 09:10:10       0
4 2018-06-01 09:15:10       1
5 2018-06-01 09:20:10       1