带有结束起始列的时间数据帧到10分钟范围的数据帧

问题描述

我有一个数据帧,其中描述的开始和结束时间在列中。说明在另一列中。

我正在尝试将数据集转换为10分钟范围的数据框。在输出数据框中,选择开始和结束日期。如果没有数据,应该为nan

例如:

start_date = 15/09/2020 14:00:00
end_date = 16/09/2020 23:00:00

Data DataFrame

     start_time              end_time           info

15/09/2020 14:35:54       15/09/2020 15:05:48     A                
15/09/2020 15:54:05       16/09/2020 02:15:22     B 
16/09/2020 21:17:10       16/09/2020 22:15:04     A 
...

测试DataFrame

      timestamp          info

15/09/2020 14:00:00       nan   
15/09/2020 14:10:00       nan
15/09/2020 14:20:00       nan
15/09/2020 14:30:00       A
15/09/2020 14:40:00       A
15/09/2020 14:50:00       A
15/09/2020 15:00:00       A
15/09/2020 15:10:00       A
15/09/2020 15:20:00       nan
15/09/2020 15:30:00       nan
15/09/2020 15:40:00       nan
15/09/2020 15:50:00       B
15/09/2020 16:00:00       B
15/09/2020 16:10:00       B
15/09/2020 16:20:00       B
...

到目前为止,我已经完成:

data['timestampStart'] = pd.to_datetime(data['timestampStart'])
data['timestampEnd'] = pd.to_datetime(data['timestampEnd'])

range_time = pd.date_range(start=start_date,end=end_date,freq='10min')
test= pd.DataFrame()
test['timestamp'] = pd.to_datetime(range_time)

for index,row in data.iterrows():
    if test['timestamp'] > data['timestampStart'] & test['timestamp'] < data['timestampEnd']:
        test['description'] = data['description']
    else:
        test['description'] == np.nan

在if语句中出现错误: &:“时间戳记”和“时间戳记”不支持的操作数类型

但是我被困在如何整理中。欢迎任何建议。

谢谢

解决方法

您可以尝试以下方法:

def check_date(s,d):
    if len(d[(d.timestampStart<s)&(d.timestampEnd>s)]) > 0:
        return d[(d.timestampStart<s)&(d.timestampEnd>s)].iloc[0]['info']
    else:
        return None

test['description'] = test.timestamp.apply(lambda x: check_date(x,data))

这将使用测试数据帧的每一行,以查找在数据数据帧上是否找到任何匹配的值。它不是很优雅,但似乎可以正常工作。

更新:方法2

您可以更改主数据框以实现所需的功能

data['start_base'] = data.start_time.apply(lambda x: x.replace(minute=int(x.minute/10)*10,second=0))

data['timestamp'] = data.apply(lambda x: pd.date_range(start=x.start_base,end=x.end_time,freq='10min'),axis=1)

new_data = data[['timestamp','info']].explode('length')

我们实质上是在写下每个“开始” /“结束”对之间的10分钟间隔,然后通过df.explode()将其放在单个列中。 然后,您可以将其合并到“测试”数据帧,以获取所需的所有时隙。

test = test.merge(new_data,on='timestamp',how='left')