下面有一段检测器数据,为pandas.DataFrame,格式如下:检测器ID 车道编号 时间 车牌号 车速 日期 小时 分钟 秒 时间换算 车牌出现次数 6269 1 2015-12-2 14:15:38 HY2012 42 2 14 15 38 51338 3 6271 1 2015-12-2 14:16:12 HY2012 31 2 14 16 12 51372 3 6273 1 2015-12-2 14:16:45 HY2012 29 2 14 16 45 51405 3,这只是部分表格,同一车牌号可能会有多次驶入驶出记录,车辆从6269或6271进入,则视为其进入道路上游或下游路段,若被6271或6273捕获。则视为从上游或下游路段驶出,现在需要统计车辆每次进出的道路的记录,表头做成如下形式,保存为DataFrame: | 车牌号 | 驶入时间 | 驶入车速 | 驶入车道 | 驶出时间 | 驶出车速 | 驶出车道 | 平均车速 |应该如何实现
时间: 2023-05-27 14:03:16 浏览: 81
可以先对数据进行按照时间排序,再进行逐行遍历处理得到进出道路记录。
具体步骤如下:
1. 根据时间列对数据进行升序排列,即 df = df.sort_values('时间')。
2. 创建空列表 records,用于存储每辆车的进出道路记录。
3. 遍历 df 的每一行,如果该行车牌号在 records 中不存在,则将其添加进 records 中,同时标记为 “进入记录”;如果存在,且为 “进入记录”,则将车牌号对应的记录中的 “进入时间”、“进入车道”、“进入车速” 三项填充,同时标记为 “出去记录”;如果存在,且为 “出去记录”,则将车牌号对应的记录中的 “出去时间”、“出去车道”、“出去车速” 三项填充,同时计算平均车速并存储到记录中。
4. 将 records 转换成 DataFrame 格式,添加表头,即可得到所需结果。
具体代码如下:
```python
# 对数据按时间排序
df = df.sort_values('时间')
# 创建空列表
records = []
# 遍历每一行
for i in range(len(df)):
row = df.iloc[i]
plate_num = row['车牌号']
lane_num = row['车道编号']
time = row['时间']
speed = row['车速']
enter_time, enter_speed, enter_lane = None, None, None
exit_time, exit_speed, exit_lane = None, None, None
avg_speed = None
# 判断记录是否已存在
exists = False
for record in records:
if record['车牌号'] == plate_num:
exists = True
if record['状态'] == '进入记录':
enter_time = time
enter_speed = speed
enter_lane = lane_num
record['进入时间'] = enter_time
record['进入车速'] = enter_speed
record['进入车道'] = enter_lane
record['状态'] = '出去记录'
else: # record['状态'] == '出去记录'
exit_time = time
exit_speed = speed
exit_lane = lane_num
avg_speed = (exit_speed + record['进入车速']) / 2
record['出去时间'] = exit_time
record['出去车速'] = exit_speed
record['出去车道'] = exit_lane
record['平均车速'] = round(avg_speed, 2)
record['状态'] = '进入记录'
if not exists:
record = {}
record['车牌号'] = plate_num
record['进入时间'] = time
record['进入车速'] = speed
record['进入车道'] = lane_num
record['状态'] = '进入记录'
records.append(record)
# 转换成 DataFrame 并添加表头
result_df = pd.DataFrame(records, columns=['车牌号', '驶入时间', '驶入车速', '驶入车道', '驶出时间', '驶出车速', '驶出车道', '平均车速'])
```
阅读全文