当前位置: 首页 > news >正文

基于pandas,按日期时间排序,计算每个连续段的开始时间、结束时间,以及时长

1:项目内容:
1.根据所给数据
2. 按日期时间排序
3. 计算相邻两个时间差(分钟),判断是否连续(<=1分钟)
4. 生成连续段编号(连续段内时间差都<=1分钟,一旦大于1分钟就断开)
5. 计算每个连续段的开始时间、结束时间,以及时长(如果开始时间等于结束时间,则时长为1分钟;否则为分钟数)
6. 将每个连续段分配到开始时间所在的日期(注意:这里我们只取日期部分,不取时间)
7. 对每个日期,将该日期的所有连续段按开始时间排序(实际上生成时就是按时间顺序的),然后每个连续段取起、止、时长三个值。
8. 每个日期取全部的连续段
9. 计算每个日期的总时长(该日期所有连续段的时长和)
10. 输出表格:列包括日期,然后依次是每个时间段的起、止、时长,最后是总时长。

2:输入示例
在这里插入图片描述
3:输出示例
在这里插入图片描述

import pandas as pd
import os# 1. 读取数据(确保你使用的是CSV而非Excel)
df = pd.read_csv('C:/Users/Administrator/Desktop/统计/#3.csv', encoding='utf-8-sig')# 2. 筛选平均值范围
df = df[(df['平均值'] > 0) & (df['平均值'] < 11)].copy()# 3. 转换日期时间格式# 4. 排序
df = df.sort_values('日期时间').reset_index(drop=True)# 5. 计算相邻时间差(分钟)
df['时间差'] = df['日期时间'].diff().dt.total_seconds().div(60).fillna(0)# 6. 分段(时间差 >1 分钟视为新段)
df['段编号'] = (df['时间差'] > 1).cumsum()# 7. 聚合段落信息
segments = df.groupby('段编号').agg(起始时间=('日期时间', 'first'),结束时间=('日期时间', 'last')
).reset_index()# 8. 计算时长(分钟)
segments['时长'] = (segments['结束时间'] - segments['起始时间']).dt.total_seconds().div(60).astype(int)
segments['时长'] = segments['时长'].apply(lambda x: 1 if x == 0 else x)# 9. 添加日期字段
segments['日期'] = segments['起始时间'].dt.date# 10. 构造每个段的字符串表示:起始~结束(X分钟)
segments['时间段'] = segments.apply(lambda row: f"{row['起始时间'].strftime('%H:%M')}~{row['结束时间'].strftime('%H:%M')}({row['时长']}分钟)", axis=1)# 11. 每天作为一行,将时间段展开成多列
pivot_data = segments.groupby('日期').agg({'时间段': lambda x: list(x),'时长': 'sum'
}).reset_index()# 12. 拆分每个时间段为独立列
max_len = pivot_data['时间段'].apply(len).max()
for i in range(max_len):pivot_data[f'时段{i+1}'] = pivot_data['时间段'].apply(lambda x: x[i] if i < len(x) else '')# 13. 重命名总时长列
pivot_data.rename(columns={'时长': '总时长(分钟)'}, inplace=True)# 14. 删除原始时间段列
pivot_data.drop(columns='时间段', inplace=True)# 15. 保存结果
output_path = 'C:/Users/Administrator/Desktop/统计/output/#3汇总.xlsx'
os.makedirs(os.path.dirname(output_path), exist_ok=True)
pivot_data.to_excel(output_path, index=False)# 16. 打印前几行结果
print(pivot_data.head())
http://www.dtcms.com/a/286417.html

相关文章:

  • Selenium自动化浏览器操作指南
  • Deep Multi-scale Convolutional Neural Network for Dynamic Scene Deblurring 论文阅读
  • DTW算法解决时序问题的解析实践
  • 【C++】std::exchange 原子性 返回值优化RVO
  • js基本数据类型之字符串类型
  • Python 数据分析与可视化:从基础到进阶的技术实现与优化策略
  • svn如何设置忽略文件夹或者文件的提交
  • PyQt5信号与槽(信号与槽的高级玩法)
  • 四足机器人远程视频与互动控制的全链路方案
  • 【C++】——类和对象(中)——默认成员函数
  • 【世纪龙科技】汽车故障诊断与排除仿真教学软件让课堂更高效安全
  • 【RK3576】【Android14】开发板概述
  • iOS WebView 调试实战 全流程排查接口异常 请求丢失与跨域问题
  • github jekyll+chirpy主题搭建博客
  • 【.net core】支持通过属性名称索引的泛型包装类
  • Spring AI开发智能客服(Tool calling)
  • Linux 定时任务全解析:atd 与 crond 的区别及实战案例(含日志备份 + 时间写入)
  • SpringBoot项目创建,三层架构,分成结构,IOC,DI相关,@Resource与@Autowired的区别
  • 融合优势:SIP 广播对讲联动华为会议 全场景沟通响应提速​
  • 【PHP】Swoole:CentOS安装MySQL+Swoole
  • 强化学习框架VeRL全面解析(架构、调试、修改与应用)
  • vbox增加虚拟磁盘空间大小
  • 基于springboot+vue+mysql的在线文档管理系统的设计与实现(源码+论文+PPT答辩+开题报告)
  • ClickHouse物化视图避坑指南:原理、数据迁移与优化
  • ESP32-IDF LVGL UI 设计工具的使用
  • 海森矩阵(Hessian Matrix)在SLAM图优化和点云配准中的应用介绍
  • Go 的热重载工具 Air 详解
  • 深入理解 Spring:事务管理与事件机制全解析
  • 域名WHOIS信息查询免费API使用指南
  • 【CF】⭐Day104——Codeforces Round 840 (Div. 2) CE (思维 + 分类讨论 | 思维 + 图论 + DP)