需求描述

一份数据集描述每个站点在各个时间段内的总降雨量,可以将这个时间段的每分钟平均降雨量视为这1分钟的降雨量,最终整理合并出按整点小时统计的降雨量。例如结果是6:00-7:00,7:00-8:00等。

按照需求方的计算思路是先按照如下方法计算:

然后重采样到小时的单位。

但是原始数据集有上百万条,经过这样处理后可能出现上亿条中间数据,很可能导致内存不足。所以我出场使用一些几乎不使用额外内存的巧妙方式。

需求解决

首先读取数据集:

import pandas as pddf = pd.read_csv("river/data1980.csv", parse_dates=["s_date", "e_date"])
df.sort_values(by=['code', 's_date'], ignore_index=True, inplace=True)
print(df.shape)
df.head(20)
(532390, 4)

咱们的测试数据共48万条。可以很明显的看到角标11到角标12的时间段再按小时拆分后存在重叠时间段,需要合并。

最终完整处理代码为:

result = []
# last_code用于记录上一个站
last_code = None
for code, s_date, e_date, flow in df.itertuples(False):# 当前时间段的总秒数total_minutes = (e_date - s_date).total_seconds()# 按小时整点处切分当前时间段,并处理边界问题dates = pd.date_range(s_date.ceil('H'), e_date.floor('H'), freq='h').to_list()if len(dates) == 0 or s_date != dates[0]:dates.insert(0, s_date)if len(dates) == 1 or e_date != dates[-1]:dates.append(e_date)# 对于同一站而言判断当前起始时间是否可以和前一条数据合并cur_minutes = (dates[1]-dates[0]).total_seconds()if code == last_code and result[-1][1]+pd.tseries.offsets.Hour() >= dates[1]:result[-1][2] = dates[1]result[-1][3] += cur_minutes*flow/total_minuteselse:result.append([code, dates[0], dates[1],cur_minutes*flow/total_minutes])# 处理除第一个时间段以外的剩余时间段for start_date, end_date in zip(dates[1:-1], dates[2:]):cur_minutes = (end_date-start_date).total_seconds()result.append([code, start_date, end_date,cur_minutes*flow/total_minutes])last_code = code
result = pd.DataFrame(result, columns=["code", "start_date", "end_date", "flow"])
result.start_date = result.start_date.dt.floor("H")
result.end_date = result.end_date.dt.ceil("H")
result.sort_values(by=['code', 'end_date'], ignore_index=True,ascending=True, inplace=True)
print(result.shape)
result.head(100)

共134万多条结果数据:

(1346022, 4)

截取一部分有代表性的合并结果示例:

后面需求方又要求缺失断层的时间段用0填充,基于前面的代码修改,经初步测试出现严重的内存不足,于是进一步升级分区处理,每个站点处理完成结果便落地磁盘。

最终代码为:

import osfor i, (code, df_split) in enumerate(df.groupby("code"), 1):print(i, code)result = []for code, s_date, e_date, flow in df_split.itertuples(False):# 当前时间段的总秒数total_minutes = (e_date - s_date).total_seconds()# 按小时整点处切分当前时间段,并处理边界问题dates = pd.date_range(s_date.ceil('H'), e_date.floor('H'), freq='h').to_list()if len(dates) == 0 or s_date != dates[0]:dates.insert(0, s_date)if len(dates) == 1 or e_date != dates[-1]:dates.append(e_date)cur_minutes = (dates[1]-dates[0]).total_seconds()# 判断当前起始时间是否可以和前一条数据合并if result and result[-1][1]+pd.tseries.offsets.Hour() >= dates[1]:result[-1][2] = dates[1]result[-1][3] += cur_minutes*flow/total_minuteselse:# 与前一条数据相差超过1小时的需要填充0if result and result[-1][2]+pd.tseries.offsets.Hour() <= dates[0]:date_zeros = pd.date_range(result[-1][2].ceil('H'), dates[0].floor('H'), freq='h')for start_date, end_date in zip(date_zeros[:-1], date_zeros[1:]):result.append([code, start_date, end_date, 0])result.append([code, dates[0], dates[1],cur_minutes*flow/total_minutes])# 处理除第一个时间段以外的剩余时间段for start_date, end_date in zip(dates[1:-1], dates[2:]):cur_minutes = (end_date-start_date).total_seconds()result.append([code, start_date, end_date,cur_minutes*flow/total_minutes])result = pd.DataFrame(result, columns=["code", "start_date", "end_date", "flow"])result.start_date = result.start_date.dt.floor("H")result.end_date = result.end_date.dt.ceil("H")result.sort_values(by=['end_date'], ignore_index=True,ascending=True, inplace=True)file = "result.csv"result.to_csv(file, index=False, mode='a', header=not os.path.exists(file))

经过近8分钟的漫长等待终于处理完成,结果文件达到1.16GB。

从结果文件可以看到能够顺利的插入空值0:

将不规则时间段降雨量拆分合并到整点小时时间段相关推荐

  1. PDF文件拆分合并器PDF Merge PDF Splitter + Mac

    PDF Merge & PDF Splitter + Mac是专为Mac用户所提供的PDF文件拆分合并器,PDF Merge & PDF Splitter + Mac版能够为您将快速多 ...

  2. python处理Excel实现自动化办公教学(数据筛选、公式操作、单元格拆分合并、冻结窗口、图表绘制等)【三】

    相关文章: python处理Excel实现自动化办公教学(含实战)[一] python处理Excel实现自动化办公教学(含实战)[二] python处理Excel实现自动化办公教学(数据筛选.公式操作 ...

  3. 学习Python处理Excel 难度1级别 多表合并、数据透视表、拆分合并单元格并获得一维表

    #本代码要点:多表合并.数据透视表.拆分合并单元格并获得一维表 #主题:各门店合并,计算各店当月回店做服务2次+的客人数量 #EXCEL工作表:存在合并单元格 #备注: import pandas a ...

  4. excel表格内容拆分_表格技巧—Excel 多行数据拆分合并的方法

    在我们实际工作中经常会遇到需要拆分数据及合并数据的情况,当表格内容不多时手动进行合并拆分并不难,但是多行数据需要进行拆分合并时应当如何快速操作呢?今天我们一起来学习Excel多行数据的拆分合并. 首先 ...

  5. java合并时间点为时间段(时间区间)

    如何将 {2022-08-01,2022-08-02,2022-08-03,2022-08-04,2022-08-06,2022-08-07} 这种时间点的list转化为 {"startDa ...

  6. 使用python开发的图形界面的pdf拆分合并工具

    前一段有一个几千页的pdf文件,想分割成几个小的文件,本来用python写过一个pdf文件拆分的工具,因为笔记本坏掉,代码丢掉了.又不想重写,就上网去搜pdf的拆分工具,结果发现很多pdf拆分工具,有 ...

  7. axure 8 表格合并_如何在亚马逊创建变体案例 灵活运用拆分/合并变体及基础问题...

    亚马逊如何创建变体流程 多属性商品一般适用于服饰类.珠宝类等商品,我们称之为变体商品.这种商品的形式如下,买家可以选择尺寸和颜色,当卖家选择不同颜色时,商品的图片会随之变化,选择不同尺寸和颜色时,价格 ...

  8. 【JUC】Fork / Join 拆分合并

    分支合并例子 /*** 计算1+2+3...+100 , 拆分成多任务计算,最后汇总,拆分标准是最大最小值差值不超过10* 如果任务比较耗时,明显多线程拆分要快得多*/ class MyTask ex ...

  9. JAVA POI拆分合并的单元格

    JAVA POI拆分合并的单元格 最近项目中需要做一个导入功能,但是EXCEL数据有合并单元格的情况出现,导入的数据需要直接入库,合并单元格的数据首行会有数据,但次行的值为空.见下图 需要获取C列和E ...

最新文章

  1. 2022-2028年中国橡胶板的制造行业发展战略规划及投资方向研究报告
  2. 19-spring学习-springMVC环境配置
  3. php是什么症状脾虚什么症状怎么治,脾虚的5个症状是什么呢
  4. 汇编语言LENGTHOF运算符:计算数组中元素的个数
  5. windows下 VScode+CMake+Linux远程调试
  6. 利用状态图实现词法分析
  7. Andorid与webView交互,获取webView选中文字,兼容了iframe
  8. 江南大学物联网工程学院数据库课程实验二作业2实验报告
  9. Mac远程连接服务器
  10. Linux硬盘分区与文件系统---学习笔记
  11. VS C#/C++ 工具箱显示出来 工具箱不见了
  12. Stored Outline
  13. ubuntu修改桌面主文件夹为英文
  14. 抖音返利CPS系统APP平台开发
  15. 任意四面体的外接球的半径(克列尔(A.L.Crelle)公式)
  16. 【SVN】SVN搭建以及客户端使用|错误记录
  17. html表格向上,实现table上下滚动
  18. 基于粒子群优化算法的最小二乘支持向量机预测模型构建(MATLAB实现)
  19. 关于25岁学编程会不会晚的最佳回答!
  20. Java设计模式中组合模式是什么/树形结构怎么组合或显示存储,编程怎么实现树形结构

热门文章

  1. html escape unescape
  2. 使用Navicat将MySql数据库导入和导出
  3. 如何有效训练你的研究能力
  4. 腾讯秋招面经(WXG一面+面委一面+面委二面)
  5. git常用命令和问题解决
  6. 前端如何在浏览器种访问获取你windows本地得文件
  7. 穆迪分析专家贡献IFRS 9和CECL新书
  8. 华东理工大学2022计算机考研,2022社会学考研经验贴
  9. Windows服务简介(转)
  10. windows服务创建