基于Python将累计时长转换为含厘秒的时间格式问题求助
为无时间字段的数据包添加累计时间列解决方案
需求说明
分析一组无时间字段的数据包数据,需新增三列时间相关字段:
Duration_Hz:累计的0.01秒单位数(每个数据包对应1个单位)Duration_Second:累计秒数(单位:秒)Duration:含厘秒的累计时间格式(如00:00:00:00,格式为时:分:秒:厘秒)
核心逻辑:每个数据包对应0.01秒(即1厘秒),需基于数据包编号计算累计时间并格式化。
原始数据示例
| Packet | Value |
|---|---|
| 196 | 0.631 |
| 197 | 0.742 |
| ... | ... |
之前尝试的核心代码
# 获取首尾数据包编号 firstMoment_fps = df_all_data.head(1)['PacketCounter'].values[0] lastMoment_fps = df_all_data.tail(1)['PacketCounter'].values[0] nr_intervals_needed = abs((firstMoment_fps - lastMoment_fps)//100) # 计算区间起始点 interval = 0 intervals = [] start = firstMoment_fps while start < lastMoment_fps: nextMoment = start + 100 if nextMoment < lastMoment_fps: start = nextMoment interval = interval + 1 intervals.append(start) else: break
正确实现方案
利用Pandas的向量运算即可高效完成,无需复杂循环:
import pandas as pd # 假设数据已加载到df中,以下为示例数据 data = {'Packet': [196, 197, 198, 200], 'Value': [0.631, 0.742, 0.853, 0.964]} df = pd.DataFrame(data) # 1. 计算当前数据包与第一个数据包的偏移量(直接对应累计厘秒数) df['offset'] = df['Packet'] - df['Packet'].iloc[0] # 2. 生成Duration_Hz:累计0.01秒单位数(从1开始计数) df['Duration_Hz'] = df['offset'] + 1 # 3. 生成Duration_Second:累计秒数 df['Duration_Second'] = df['Duration_Hz'] * 0.01 # 4. 格式化生成Duration列(时:分:秒:厘秒) def format_centiseconds(total_cs): hours = total_cs // 360000 # 1小时=360000厘秒 remaining = total_cs % 360000 minutes = remaining // 6000 # 1分钟=6000厘秒 remaining %= 6000 seconds = remaining // 100 # 1秒=100厘秒 centiseconds = remaining % 100 return f"{hours:02d}:{minutes:02d}:{seconds:02d}:{centiseconds:02d}" df['Duration'] = df['offset'].apply(format_centiseconds) # 查看最终结果 print(df[['Packet', 'Value', 'Duration_Hz', 'Duration_Second', 'Duration']])
代码说明
offset:计算每个数据包相对于第一个包的编号差值,直接得到累计的厘秒数(每个包对应1厘秒)Duration_Hz:以第一个数据包为1,累计计数0.01秒的单位数量Duration_Second:通过单位数乘以0.01直接得到累计秒数format_centiseconds:将累计厘秒数转换为指定的时间格式,用02d确保每个部分都是两位数字
输出示例
| Packet | Value | Duration_Hz | Duration_Second | Duration |
|---|---|---|---|---|
| 196 | 0.631 | 1 | 0.01 | 00:00:00:00 |
| 197 | 0.742 | 2 | 0.02 | 00:00:00:01 |
| 198 | 0.853 | 3 | 0.03 | 00:00:00:02 |
| 200 | 0.964 | 5 | 0.05 | 00:00:00:04 |
内容的提问来源于stack exchange,提问作者diguex
相关产品推荐
相关产品推荐

