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

报告系统状态的连续日期 mysql + pandas(连续值判断)

本题用到知识点:row_number(), union, date_sub(), to_timedelta()……

目录

思路

pandas

Mysql


思路

链接:报告系统状态的连续日期

思路:

判断连续性常用的一个方法,增量相同的两个列的差值是固定的。

让日期与行号 * 天数相减,连续的区域就会的得到相同的结果。

不同的连续区域得到不同结果(因为来连续到不连续,中间出现了增量不为1的情况。但是行号总是增量为1,所以下一个连续区域与行号的差值与上一个连续区域不同。)

如:1~2 连续,7~8连续,但是与行号的差值tag并不相同。

根据相同的tag分组后,找到分组种的最大最小时间分别作为开始时间和结束时间,

两个表都根据上述操作后之际纵向拼接后按照开始时间升序输出。

pandas

import pandas as pddef report_contiguous_dates(failed: pd.DataFrame, succeeded: pd.DataFrame) -> pd.DataFrame:f_date_vaild = (failed['fail_date'] >= '2019-01-01') & (failed['fail_date'] <= '2019-12-31')failed = failed[f_date_vaild]failed['tag'] = failed['fail_date'] - pd.to_timedelta(failed.index,unit='d')failed = failed.groupby(by='tag')['fail_date'].agg(start_date='min',end_date='max').reset_index()failed['tag'] = 'failed's_date_vaild = (succeeded['success_date'] >= '2019-01-01') & (succeeded['success_date'] <= '2019-12-31')succeeded = succeeded[s_date_vaild]succeeded['tag'] = succeeded['success_date'] - pd.to_timedelta(succeeded.index, unit='d')succeeded = succeeded.groupby(by='tag')['success_date'].agg(start_date='min', end_date='max').reset_index()succeeded['tag'] = 'succeeded'return pd.concat([succeeded,failed],axis=0).rename(columns={'tag':'period_state'}).sort_values(by='start_date',ascending=True)

中间结果示例:failed表获取tag后

Mysql

pandas直接使用index作为行号,mysql则使用排名row_number()来获得固定增量的行号。

with f as 
(
select fail_date,
row_number() over(order by fail_date asc) as rn from failed 
where fail_date between '2019-01-01' and '2019-12-31')
,fg as 
(
select 'failed' as period_state,
min(fail_date) as start_date,
max(fail_date) as end_date
from 
(
select 
fail_date,
date_sub(fail_date,interval rn  day) as tag
from f 
) t
group by tag
)
,
s as 
(
select success_date,
row_number() over(order by success_date asc) as rn from succeeded
where success_date between '2019-01-01' and '2019-12-31'
)
,
sg as 
(
select 'succeeded' as period_state,
min(success_date) as start_date,
max(success_date) as end_date
from 
(
select 
success_date,
date_sub(success_date,interval rn  day) as tag
from s 
) t
group by tag
)select * from 
(
(select * from fg)union all (select * from sg)
) t
order by start_date asc

http://www.xdnf.cn/news/71353.html

相关文章:

  • 从「+AI」到「AI+」大模型正在抹平项目管理的“人工断层”
  • 为什么RPN生成的候选框,要使用rcnn来进行分类和回归操作?
  • 编译原理实验(四)———— LR(1)分析法
  • 实验七 shell程序设计
  • python生成动态库在c++中调用
  • 【JavaEE】计算机的工作原理
  • 乐家桌面纯净版刷机ROM下载 乐家桌面纯净版2025官方最新下载
  • 会话跟踪技术:让我们更懂用户
  • 使用stream进行列表循环和直接forEach循环的差异及使用场景
  • 环形缓冲区容量耗尽解决方案
  • 如何判断设备是否支持带电插拔——从原理到实操的全面解析
  • C# 运算符:?.(null 条件运算符)和 ??(null 合并运算符)
  • AI技术驱动SEO关键词策略革新
  • 接口测试流程和步骤
  • 基于SA模拟退火算法的车间调度优化matlab仿真,输出甘特图和优化收敛曲线
  • 【Andorid备案获取keystore里面的公钥和SHA-1码等等】
  • Linux——入门常用基础指令
  • 前端通过jenkins和docker打包部署流程
  • 爬虫获取sku信息需要哪些库
  • 入门-C编程基础部分:16、 预处理器
  • 如何动态调整Python爬虫的Request请求延迟
  • Java写数据结构:栈
  • MySQL《事务》
  • ts中的类型
  • 【EasyPan】application.properties配置文件解析
  • 企业常见漏洞类型
  • 《浔川代码编辑器v2.0内测(完整)报告》
  • 创新项目实训开发日志3
  • 深度剖析d3dx9_42.dll错误:从原理到解决d3dx9_42.dll丢失方案
  • 总结设计测试用例的万能公式