将间隔转换为日期时间
Convert Intervals to DateTimes
我有一个 DataFrame,其中包含某个传感器处于活动状态的时间间隔:
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
您可以将上面的内容解读为“active == 1
如果传感器在间隔 [t, t+X]
内处于活动状态”。
请注意间隔并不总是不相交的。
目前,我正在将间隔转换为 DatetimeIndex
,频率为 X
分钟。之后我再次对系列进行重采样(考虑重叠间隔):
indices = []
for _, row in df.iterrows():
indices.append(pd.date_range(row['start'], row['end'], freq='5T'))
index = indices[0].append(indices[1:])
series = pd.Series(np.ones(len(index), dtype=bool), index=index)
series = series.resample('5T').max().fillna(0)
我的数据集大约有 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)
结果:
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
1500 万行应该需要几秒钟。
我有一个 DataFrame,其中包含某个传感器处于活动状态的时间间隔:
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
您可以将上面的内容解读为“active == 1
如果传感器在间隔 [t, t+X]
内处于活动状态”。
请注意间隔并不总是不相交的。
目前,我正在将间隔转换为 DatetimeIndex
,频率为 X
分钟。之后我再次对系列进行重采样(考虑重叠间隔):
indices = []
for _, row in df.iterrows():
indices.append(pd.date_range(row['start'], row['end'], freq='5T'))
index = indices[0].append(indices[1:])
series = pd.Series(np.ones(len(index), dtype=bool), index=index)
series = series.resample('5T').max().fillna(0)
我的数据集大约有 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)
结果:
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
1500 万行应该需要几秒钟。