Python办公之一:获取多组数据的每日平均值的近似值所对应的日期
Python办公之一:获取多组数据的每日平均值的近似值所对应的日期
一、需求
1、数据描述:1000个通道,每个通道每日不定时采集数据n份。
2、结果描述:每个通道每日取一组数据(日期,壁厚),要求壁厚是每日数据与平均值最接近的一个数。
3、原始数据图:
二、设计
1、读取原始数据
一共需要提取1000组、365天的数据,观察数据在excel表中的形式,结合后期处理方式,确定以字典包含列表的形式提取数据,方便后面对数据的操作
#获取excel需要操作的工作页
#参数:route:路径;sheet_name:工作页
def tab(route, sheet_name):data = xlrd.open_workbook(route)data.sheet_names()table = data.sheet_by_name(sheet_name)return table
#导入井口摄像头数据(数据形式以两列,同间隔格式)
'''
route:路径
sheet_name:工作页
number_lie:第几列开始取值
numbel_hang:第几行开始取值
n:探头个数
interval:相同数据的间隔(不同探头数据的日期行间隔)
返回值:返回一个列表,形式:list = [{'lie_1':['44078.7','44079.64', ...]},{'dlie_1':['21.17', '21.18', ...]}]
'''
def imp(route, sheet_name, number_lie, numbel_hang, interval, n):table = tools.MyLibrary.tab(route, sheet_name)lis = []dic01 = {}dic02 = {}num = 0for j in range(1, n+1):#1,2,3,4...12dic01['lie_' + str(j)] = [str(table.cell_value(i, numbel_hang-1+interval*num)) for i in range(number_lie-1, table.nrows)]dic02['dlie_' + str(j)] = [str(table.cell_value(i, numbel_hang+interval*num)) for i in range(number_lie-1, table.nrows)]num += 1lis.append(dic01)lis.append(dic02)return lis
2、筛选数据需要的工具
1、需要筛选数据,首先需要把数据卡在每天内,然后取每天对应壁厚值的平均值,读取的数据与指定日期对比,先生成一个指定日期列表来作为对比列表使用
#创建日期列表,参数date:最小日期;参数n:日期总数
'''
date:最小日期
n:需要计算的日期个数
'''
def riqi(date, n):li = []for i in range(n):li.append(date+i)return li
2、从excel中提取的数据是字符串形式,如果需要进行数学运算必须要转换数据类型,所以,还需要一个转换数据类型的函数
#转换提取数据类型
'''
li:接收一个需要转换成float类型的列表
'''
def zhuanhuan(li):l1 = []for i in li:l1.append(float(i))return l1
3、现在前期工作基本准备完毕了,我们需要开始对导入数据的字典进行处理,一次处理1000组数据显然很复杂,所以为了化繁为简,我们就处理一组数据,使每天所测量的日期和壁厚存在一个字典里,形成对应关系
#获取每组数据字的典形式
'''
date_li:日期列表
lis:需要处理的一套数据列表,[['44078.7','44079.64', ...],['21.17', '21.18', ...]]
n:第n套数据
返回值:[{1.2: 1, 1.1: 2, 1.8: 2.2}, {2.5: 2, 2.6: 3, 2.8: 4}, {3.1: 3, 3.4: 4}, {7.7: 1}, {8.3: 5}]
'''
def lie_dic(date_li, lis, n):li = []lie01 = lis[0]['lie_' + str(n)]#获取日期列表lie02 = lis[1]['dlie_' + str(n)]#获取壁厚列表lie01 = [i for i in lie01 if i != '']#去除列表中的空值,不去除无法进行比较运算lie02 = [i for i in lie02 if i != '']lie01 = zhuanhuan(lie01)#字符串类型转换为浮点类型lie02 = zhuanhuan(lie02)for i in date_li:dic = {}for j in range(len(lie01)):if lie01[j] > i and lie01[j] < (i+1):dic[lie01[j]] = lie02[j]li.append(dic)li1 = []for i in range(len(li)):#去除空的列表if bool(li[i]):li1.append(li[i])li = li1return li
4、现在我们已经将每日数据分开了,接下来就是计算出每日壁厚的平均值,与原平局值做差对比,选择一个最接近的值,利用角标关系对应出选出壁厚对应的日期,最后把它存在一个嵌套列表里面,方便后面的输出
#数据分组整理:
'''
m:每组数据字典形式,[{1.2: 1, 1.1: 2, 1.8: 2.2}, {2.5: 2, 2.6: 3, 2.8: 4}, {3.1: 3, 3.4: 4}, {7.7: 1}, {8.3: 5}]
re_list:每组数据列表形式,[[1.1, 2.6, 3.1, 7.7, 8.3], [2, 3, 3, 1, 5]]
'''
def group(m):res = []re_lie01 = []re_lie02 = []for i in range(len(m)):#循环大列表,得出每个字典c = []a = list(m[i].keys())b = list(m[i].values())c.append(a)c.append(b)res.append(c)for i in range(len(res)):avg = sum(res[i][1]) / len(res[i][1])chaji = []for j in res[i][1]:x = abs(avg - j)chaji.append(x)min_index = chaji.index(min(chaji))re_lie01.append(res[i][0][min_index])re_lie02.append(res[i][1][min_index])re_list = []re_list.append(re_lie01)re_list.append(re_lie02)return re_list
5、现在待输出的数据已经获得,接下来就需要输出到新的excel中了,在此之前,我们需要对输出到excel的格式进行设置:
#设置输出单元格格式
'''
name:字体样式名称
height:字体高度
bold:字体是否加粗
'''
def set_style(name, height, bold=False):style = xlwt.XFStyle()#初始化样式font = xlwt.Font()#创建字体样式font.name = namefont.bold = boldfont.color_index = 4font.height = heightstyle.font = fontreturn style
#写入excel
'''
re_list:每组数据列表形式,[[1.1, 2.6, 3.1, 7.7, 8.3], [2, 3, 3, 1, 5]]
n:写入excel的列号
path:写入路径
'''
def write_excel(re_list, n, path):r_xls = xlrd.open_workbook(path) # 读取excel文件 r'H:\目标文件\最终数据.xls'# row = r_xls.sheets()[0].nrows # 获取已有的行数excel = copy(r_xls) # 将xlrd的对象转化为xlwt的对象table = excel.get_sheet(0) # 获取要操作的sheetstyle = tools.MyLibrary.set_style('Times New Roman', 20 * 11)for i in range(len(re_list[0])):table.write(i, n, re_list[0][i], style)table.write(i, n+1, re_list[1][i], style)excel.save(path)
6、最后就是将数据逻辑输出:
#main,逻辑输出
#读取需要操作的数据
daoRuList = imp(r'H:\目标文件\02 BZ3-1X壁厚数据更新至2020.11.12.xls', '左侧101-112', 5, 3, 4, 12)
#生产日期范围列表
dateList = riqi(44078, 69)x = 0
for i in range(1000):#获取每天所测量的日期和壁厚对应的字典meiZuDic = lie_dic(dateList, daoRuList, i+1)#获取最终得出数据的列表meiZuList = group(meiZuDic)#循环1000组数据,并输出write_excel(meiZuList, x, r'H:\目标文件\最终数据.xls')x = x + 3
此方法来自一个正在学习python3全栈的小白~
欢迎大家评论、指正!
Python办公之一:获取多组数据的每日平均值的近似值所对应的日期相关推荐
- python中计算如何实现_基于python如何实现计算两组数据P值
我们在做A/B试验评估的时候需要借助p_value,这篇文章记录如何利用python计算两组数据的显著性. 一.代码# TTest.py # -*- coding: utf-8 -*- ''' # C ...
- 【逗老师带你学IT】PRTG监控通过Python+Modbus RTU获取温湿度传感器数据
前文[逗老师带你学IT]PRTG监控通过Python+TCP Modbus获取温湿度传感器数据中我们讲了如何通过Python读取支持TCP Modbus的传感器数据.本章我们讲解下如何读取Modbus ...
- 【逗老师带你学IT】PRTG监控通过Python+TCP Modbus获取温湿度传感器数据
本文介绍,Python如何通过TCP Modbus协议获取温湿度传感器数据.并在PRTG监控系统中呈现. 本文主要涉及知识点: 1.Python的ModbusTCP客户端实现 2.常见温湿度传感器中, ...
- python使用bs4获取网页排行榜数据(基础版)
1.首先来到B站排行榜页面,按F12分析结构 2.鼠标放在代码上,一行一行往下移动,不要急,给浏览器一点反应时间. 3.当你发现排行榜所在位置被覆盖了,如下图,证明排行榜的代码就在这里 4.接下来,打 ...
- C语言 知道两组数据分别的平均值和标准差,如何计算其相关系数
两组数据的样本量必然是一样的,所以只需要输入一次样本量: #include <stdio.h> #include <math.h>double compute_d(double ...
- 【Python】pandas获取全省人口数据并作可视化分析
前言 目录 前言 代码实现 可视化分析 今天我们看看自己所在的省份的人口人数,使用pandas并作可视化分析. 环境使用 python 3.9 pycharm 模块使用 pandas Pandas 是 ...
- python处理行情数据_利用Python脚本来获取期货行情数据
因为自己最近在学习做期货交易,想要下载期货的行情数据来做分析.有一些交易软件是可以导出数据的,但是导出的过程还是需要很多的手工操作,自己在想能不能通过Python程序来实现呢. 新浪期货数据接口介绍 ...
- Python量化:获取历史行情数据并计算KDJ指标
KDJ指标又叫随机指标,是一种相当新颖.实用的技术分析指标,它起先用于期货市场的分析,后被广泛用于股市的中短期趋势分析,是期货和股票市场上最常用的技术分析工具. 随机指标KDJ一般是用于股票分析的统计 ...
- 自动驾驶模拟器Carla之python编程-(3)获取汽车摄像头数据
在上节我们已经创建了一个可以形式的特斯拉model3,在本节,我们将给汽车上添加摄像头. 了解更多有关各种传感器以及如何使用它们的信息:Carla Sensors.现在,我将仅展示如何使用RGB相机. ...
最新文章
- ListView加checkBox可以实现全选等功能
- css实现图片动画效果
- 文件创建和删除命令:touch、rm
- java获取eureka_Spring Cloud服务发现:Eureka客户端
- Persistent Memory编程简介
- Java的各种打包方式
- 24. [Ext JS 4] 实战之Load Mask(加载遮罩)的显示与隐藏
- Fast Matrix Operations
- 【渝粤题库】国家开放大学2021春2038财务管理题目
- canvas学习之柱状图
- 将WebAPI发布到本地服务器与远程服务器
- 如何判断电脑是否中毒(转)
- 用英语推销计算机设备,销售电脑的英语对话
- sp 导出unity哪个_SP与Unity的效果差异分析
- 怎么设置微信公众号自动回复蓝色字体小程序链接
- ctfshow web入门 SSTI
- 【LeetCode】1160. 拼写单词(C++)
- 2021届硕士生年初java春招实习面试和正式校招面试经验汇总(收割腾讯,百度,美团,网易等offer)
- SQL之ignore关键字
- Vue-router 使用编程式导航多次执行会报错NavigationDuplicated的解决方法