基于DataFrame提取CSV中Byte非零连续组的起止时间
Python提取DataFrame中Byte非零连续组的起止时间
需要实现的功能:从CSV文件对应的Pandas DataFrame中,提取Byte值非零的连续数据组的以下信息:
- 开始时间:该组内Byte首次非零对应的
Date-Time - 结束时间:该组内Byte最后一次非零对应的
Date-Time;若该组是文件的最后一行数据,结束时间留空
样本1(Sample-1)
原始数据
Date-Time,Func,Byte 2023/01/01 16:45:13,APP,0 2023/01/01 16:57:08,APP,1 2023/01/01 17:10:44,APP,5 2023/01/01 17:11:04,APP,0 2023/01/01 17:12:24,APP,0 2023/01/01 17:15:27,APP,4 2023/01/01 17:16:08,APP,4
预期输出
Date/Time(Start) Func Date/Time(End) 2023/01/01 16:57:08 APP 2023/01/01 17:10:44 2023/01/01 17:15:27 APP
样本2(Sample-2)
原始数据
Date-Time,Func,Byte 2023/01/01 16:45:13,APP,4 2023/01/01 16:57:08,APP,1 2023/01/01 17:10:44,APP,5 2023/01/01 17:11:04,APP,0 2023/01/01 17:12:24,APP,0 2023/01/01 17:15:27,APP,4 2023/01/01 17:16:08,APP,4 2023/01/01 17:16:20,APP,0
预期输出
Date/Time(Start) Func Date/Time(End) 2023/01/01 16:45:13 APP 2023/01/01 17:10:44 2023/01/01 17:15:27 APP 2023/01/01 17:16:08
Python实现代码
import pandas as pd def extract_non_zero_groups(file_path): # 读取CSV文件 df = pd.read_csv(file_path) # 转换时间列为datetime类型 df['Date-Time'] = pd.to_datetime(df['Date-Time'], format='%Y/%m/%d %H:%M:%S') # 标记非零行,生成连续非零组的ID df['non_zero'] = df['Byte'] != 0 df['group_id'] = (df['non_zero'] != df['non_zero'].shift()).cumsum() # 筛选非零组并提取起止时间 non_zero_groups = df[df['non_zero']].groupby('group_id') result = non_zero_groups.agg( start_time=('Date-Time', 'first'), func=('Func', 'first'), end_time=('Date-Time', 'last') ).reset_index(drop=True) # 检查最后一组是否为原数据最后一行,是则清空结束时间 last_group_last_row = non_zero_groups.last().iloc[-1] if last_group_last_row.name == df.index[-1]: result.loc[len(result)-1, 'end_time'] = pd.NaT # 格式化时间为字符串,空值留空 result['start_time'] = result['start_time'].dt.strftime('%Y/%m/%d %H:%M:%S') result['end_time'] = result['end_time'].dt.strftime('%Y/%m/%d %H:%M:%S').fillna('') # 重命名列名匹配预期输出 result.columns = ['Date/Time(Start)', 'Func', 'Date/Time(End)'] return result # 示例调用(替换为你的文件路径) # sample1_result = extract_non_zero_groups('sample1.csv') # print(sample1_result.to_string(index=False)) # sample2_result = extract_non_zero_groups('sample2.csv') # print(sample2_result.to_string(index=False))
内容的提问来源于stack exchange,提问作者RKIDEV
相关产品推荐
相关产品推荐

