2012年数学建模竞赛脑卒中发病环境因素分析及干预日期数据处理代码

news/2025/2/21 7:14:30/

因四个表格日期数据处理有些复杂,故作此代码一次性处理四组数据 

详细说明在main函数中,复制粘贴即可使用:

import datetime
import pandas as pddef check(string, df, i, num, error_list):if is_valid(pd.to_datetime(string, errors='coerce', format='%Y/%m/%d'), error_list, i):df.iloc[i, num] = pd.to_datetime(string, errors='coerce', format='%Y/%m/%d')# 数据中空格数据的替换
def data_process(data):new_data = []for d in data:d = d.replace(" ", "")new_data.append(d)return new_data# 日期格式错误的判断与修改
def judge(df, data, i, num, date, error_list):if len(data[0]) == 4 and len(data[1]) == 2 and len(data[2]) == 2:string = data[0] + '/' + data[1] + '/' + data[2]check(string, df, i, num, error_list)elif len(data[0]) == 2 and len(data[1]) == 2 and len(data[2]) == 4:string = data[2] + '/' + data[1] + '/' + data[0]check(string, df, i, num, error_list)elif len(data[0]) == 2 and len(data[1]) == 1 and len(data[2]) == 4:string = data[2] + '/0' + data[1] + '/' + data[0]check(string, df, i, num, error_list)elif len(data[0]) == 4 and len(data[1]) == 1 and len(data[2]) == 1:string = data[0] + '/0' + data[1] + '/0' + data[2]check(string, df, i, num, error_list)elif len(data[0]) == 4 and len(data[1]) == 2 and len(data[2]) == 1:string = data[0] + '/' + data[1] + '/0' + data[2]check(string, df, i, num, error_list)elif len(data[0]) == 4 and len(data[1]) == 1 and len(data[2]) == 2:string = data[0] + '/0' + data[1] + '/' + data[2]check(string, df, i, num, error_list)elif len(data[0]) == 5 and len(data[1]) == 1 and len(data[2]) == 2:string = data[0][1:5] + '/0' + data[1] + '/' + data[2]check(string, df, i, num, error_list)elif len(data[0]) == 5 and len(data[1]) == 1 and len(data[2]) == 1:string = data[0][1:5] + '/0' + data[1] + '/0' + data[2]check(string, df, i, num, error_list)elif len(data[0]) == 5 and len(data[1]) == 2 and len(data[2]) == 1:string = data[0][1:5] + '/' + data[1] + '/0' + data[2]check(string, df, i, num, error_list)else:print("第{}行{}列异常的数据:{}".format(i + 1, num + 1, date))error_list.append(i)# 字符串年月日的处理
def str_process(df, date, i, num, error_list):string = date[0:4] + '/' + date[4:6] + '/' + date[6:8]if is_valid(pd.to_datetime(string, errors='coerce', format='%Y/%m/%d'), error_list, i):df.iloc[i, num] = pd.to_datetime(string, errors='coerce', format='%Y/%m/%d')# 判断日期是否合法 若要修改日期合法范围,直接修改函数中的(2010, 12, 31)即可
def is_valid(date, error_list, i):date1 = datetime.datetime(2007, 1, 1)date2 = datetime.datetime(2010, 12, 31)if date >= date1 and date <= date2:return Trueelse:print("第{}行异常的数据:{}".format(i + 1, date))error_list.append(i)return False# 数据处理过程
def date_process(file_path, sheet_name, new_excel, new_sheet, flag, is_delete):df = pd.read_excel(file_path, sheet_name=sheet_name)error_list = []for T in range(3, 5):col_num = df.shape[0]for i in range(col_num):try:date = df.iloc[i, T]if type(date) != datetime.datetime:try:if type(date) == int:print("第{}行{}列异常的数据:{}".format(i + 1, T + 1, date))error_list.append(i)continuedata = data_process(date.split('-'))if len(data) == 3:judge(df, data, i, T, date, error_list)elif len(data) == 2:print("第{}行{}列异常的数据:{}".format(i + 1, T + 1, date))error_list.append(i)elif len(data) == 1:data = data_process(date.split('/'))if len(data) == 3:judge(df, data, i, T, date, error_list)elif len(data) == 1:if len(date) == 8:str_process(df, date, i, T, error_list)else:print("第{}行{}列异常的数据:{}".format(i + 1, T + 1, date))error_list.append(i)else:print("第{}行{}列异常的数据:{}".format(i + 1, T + 1, date))error_list.append(i)else:print("第{}行{}列异常的数据:{}".format(i + 1, T + 1, date))error_list.append(i)except:if flag:print("第{}行{}列异常的数据:{}".format(i + 1, T + 1, date))error_list.append(i)else:is_valid(date, error_list, i)except:print("出错{} {}".format(i, col_num))continueif i >= df.shape[0] - 1:breakif is_delete:df = df.drop(df.index[error_list])df.to_excel(new_excel, index=False, sheet_name=new_sheet)# 主函数
if __name__ == '__main__':NULL_Error = True  # 空格是否算作错误,若是则为True,若不是则为Falseis_delete = True  # 错误行是否删除,若删除则为True,若不删除则为Falsefile_path = "Data/data1.xls"  # 要修改的表的文件路径(可以用绝对路径)sheet_name = "脑卒中"  # 要修改表的表名new_excel = 'data6.xls'  # 修改后数据存储文件名new_sheet = 'Sheet1'  # 修改后数据存储的表名date_process(file_path, sheet_name, new_excel, new_sheet, NULL_Error, is_delete)


http://www.ppmy.cn/news/1016559.html

相关文章

Android 13 Hotseat定制化修改——002 hotseat图标数量修改

目录 一.背景 二.实践方案 一.背景 由于需求是需要自定义修改Hotseat&#xff0c;所以此篇文章是记录如何自定义修改hotseat的&#xff0c;应该可以覆盖大部分场景&#xff0c;修改点有修改hotseat布局方向&#xff0c;hotseat图标数量&#xff0c;hotseat图标大小&#xff0…

flume系列之:运维flume常用命令汇总

flume系列之:运维flume常用命令汇总 一、查看Systemctl托管的flume服务二、查看正在运行的Systemctl托管的flume服务三、获取Systemctl托管的flume服务名称四、获取Systemctl托管的flume agent名称五、flume进程中获取flume agent名称六、查看hdfs文件大小七、生成处理指定大小…

ClickHouse(十五):Clickhouse MergeTree系列表引擎 - AggregatingMergeTree

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术&#xff0c;IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &…

Linux下的CGI服务器

一、概述 使用进程池&#xff0c;半同步/半异步并发模式。 同步进程&#xff1a;工作子进程负责进行具体的连接以及具体的I/O&#xff0c;顺序执行 异步进程&#xff1a;主进程监听连接事件&#xff0c;将连接任务分发给子线程 二、设计逻辑 1.设计进程池的创建逻辑 2.父…

【学习日记】【FreeRTOS】链表结构体及函数详解

写在前面 本文主要是对于 FreeRTOS 中链表相关内容的详细解释&#xff0c;代码大部分参考了野火FreeRTOS教程配套源码&#xff0c;作了一小部分修改。 一、结构体定义 主要包含三种结构体&#xff1a; 普通节点结构体结尾节点&#xff08;mini节点&#xff09;结构体链表结…

优化案例3:高频多union表关联穿插拼接完成计数

优化案例3&#xff1a;高频多union表关联穿插拼接完成计数 1. 引入2. 解决过程2.1 瓶颈定位思想2.2 定位解决过程2.2.1 子部分代码12.2.2 子部分代码2 2.3 优化结果 3. 优化心得 DM技术交流QQ群&#xff1a;940124259 1. 引入 已经很久没有发布文章&#xff0c;快沉底&#x…

Java进阶(1)——JVM的内存分配 反射Class类的类对象 创建对象的几种方式 类加载(何时进入内存JVM) 注解 反射+注解的案例

目录 引出java内存分配java内存分布概略图堆方法区常量池 创建对象内存分配 反射class文件的底层类加载顺序1.检查2.开辟静态资源空间3.常量池4.其他...5.创建一个唯一的类的对象获取Class对象的几种方式 创建对象几种方式new 看到new : new Book()反射 Class.forName(“包名.类…

开窗积累之学习更新版

1. 开窗使用1之 count range between current row and current row 将相同排序字段的值进行函数计算 selectsku_id,substr(create_date,1,7) date_month,order_id,create_date,sku_num*price,sum(sku_num*price) over (partition by sku_id order by substr(create_date,1,7)…