作者 | 老表

来源 | 简说Python

  • 1、前言

  • 2、开始动手动脑

    • 2.1 拆解+明确需求

    • 2.2 安装第三方包

    • 2.3 读取excel数据

    • 2.4 特殊数据数据处理

    • 2.5 其他需求

    • 2.6 完整调用代码

1、前言

今天教大家一个需求:有很多Excel,需要批量处理,然后存入不同的数据表中。

2、开始动手动脑

2.1 拆解+明确需求

1) excel数据有哪些需要修改?

  • 有一列数据DocketDate是excel短时间数值,需要转变成正常的年月日格式;
    eg. 44567 --> 2022/1/6

  • 部分数据需要按SOID进行去重复处理,根据DocketDate保留最近的数据;

  • 有一列数据需要进行日期格式转换。
    eg. 06/Jan/2022 12:27 --> 2022-1-6

主要涉及:日期格式处理、数据去重处理

2) 每一个Excel都对应一个不同数据表吗?表名和Excel附件名称是否一致?

  • 有些Excel对应的是同一个表,有些是单独的

  • 表名和Excel附件名称不一致,不过是有对应关系的
    eg. 附件test1 和 test2 对应表 testa,附件test3 对应 testb

主要涉及:数据合并处理

2.2 安装第三方包

pip3 install sqlalchemy pymssql pandas xlrd xlwt
  • sqlalchemy:可以将关系数据库的表结构映射到对象上,然后通过处理对象来处理数据库内容;

  • pymssql:python连接sqlserver数据库的驱动程序,也可以直接使用其连接数据库后进行读写操作;

  • pandas:处理各种数据,内置很多数据处理方法,非常方便;

  • xlrd xlwt:读写excel文件,pandas读写excel会调用他们。

导入包:

import pandas as pd
from datetime import date, timedelta, datetime
import time
import os
from sqlalchemy import create_engine
import pymssql

2.3 读取excel数据

读取数据比较简单,直接调用pandas的read_excel函数即可,如果文件有什么特殊格式,比如编码,也可以自定义设置。

# 读取excel数据
def get_excel_data(filepath):data = pd.read_excel(filepath)return data

2.4 特殊数据数据处理

1)日期天数转短日期

这个有一定难度,excel里直接转很简单,直接选中需要转的数据,然后在开始-数据格式栏选择短日期即可。

当时第一眼不知道其中的转换规律,搜索了很久,也没发现有类似问题或说明,首先肯定不是时间戳,感觉总有点关系,最后发现是天数,计算出天数计算起始日期就可以解决其他数据转变问题啦。

首先我们要判断空值,然后设置日期天数计算起始时间,利用datetime模块的timedelta函数将时间天数转变成时间差,然后直接与起始日期进行运算即可得出其代表的日期。

# 日期天数转短日期
def days_to_date(days):# 处理nan值if pd.isna(days):return #  44567  2022/1/6# 推算出 excel 天数转短日期 是从1899.12.30开始计算start = date(1899,12,30) # 将days转换成 timedelta 类型,可以直接与日期进行计算delta = timedelta(days)# 开始日期+时间差 得到对应短日期offset = start + deltareturn offset

这里比较难想的就是天数计算起始日期,不过想明白后,其实也好算,从excel中我们可以直接将日期天数转成短日期,等式已经有了,只有一个未知数x,我们只需列一个一元一次方程即可解出未知数x。

from datetime import date, timedeltadate_days = 44567
# 将天数转成日期类型时间间隔
delta = timedelta(date_days)
# 结果日期
result = date(2022,1,6)
# 计算未知的起始日期
x = result - delta
print(x)'''
输出:1899-12-30
'''

2)将日期中的英文转成数字

最开始我想的是使用正则匹配,将年月日都在取出来,然后将英文月份转变成数字,后来发现日期里可以直接识别英文的月份。

代码如下,首先将字符串按格式转变成日期类型数据,原数据为06/Jan/2022 12:27(数字日/英文月/数字年 数字小时:数字分钟),按日期格式化符号解释表中对应关系替换即可。

# 官方日期格式转换成常见格式
def date_to_common(time):# 处理nan值if pd.isna(time):return # 06/Jan/2022 12:27  2022-1-6# 测试 print(time,':', type(time))# 将字符串转成日期time_format = datetime.strptime(time,'%d/%b/%Y %H:%M') # 转换成指定日期格式common_date = datetime.strftime(time_format, '%Y-%m-%d') return common_date

日期格式化符号解释表
@CSDN-划船的使者

3)按订单编号SOID去重

这里去重复除了按指定列去重外,还需要按日期保留最新数据。

我的想法是,首先调用pandas的sort_values函数将所有数据根据日期列进行升序排序,然后,调用drop_duplicates函数指定按SOID列进行去重,并指定keep值为last,表示重复数据中保留最后一行数据。

代码如下:

# 去除重复值 SOID重复 按日期去除最早的数据
def delete_repeat(data):# 先按日期列 Docket Rec.Date & Time 排序 默认降序  保证留下的日期是最近的data.sort_values(by=['Docket Rec.Date & Time'], inplace=True)# 按 SOID 删除重复行data.drop_duplicates(subset=['SOID #'], keep='last', inplace=True)return data

2.5 其他需求

多个Excel数据对应一张数据库的表

可以写一个字典,来存储数据库表和对应Excel数据名称,然后一个个存储到对应的数据库表中即可(或者提前处理好数据后,再合并)。

  • 合并同类型Excel表

# 相同表合并数据 传入合并excel列表
def merge_excel(elist, files_path):data_list = [get_excel_data(files_path+i) for i in elist]data = pd.concat(data_list)return data

这里传入同一类型Excel文件名列表(elist)和数据存储文件夹绝对/相对路径(files_path)即可,通过文件绝对/相对路径+Excel文件名即可得到Excel数据表文件的绝对/相对路径,再调用get_excel_data函数即可读取出数据。

遍历读取Excel表数据利用了列表推导式,最后利用pandas的concat函数即可将对应数据进行合并。

  • 数据存储到sqlserver

# 初始化数据库连接引擎
# create_engine("数据库类型+数据库驱动://数据库用户名:数据库密码@IP地址:端口/数据库",其他参数)
engine = create_engine("mssql+pymssql://sa:123456@localhost/study?charset=GBK")# 存储数据
def data_to_sql(data, table_naem, columns):# 再对数据进行一点处理,选取指定列存入数据库data1 = data[columns]# 第一个参数:表名# 第二个参数:数据库连接引擎# 第三个参数:是否存储索引# 第四个参数:如果表存在 就追加数据t1 = time.time()  # 时间戳 单位秒print('数据插入开始时间:{0}'.format(t1))data1.to_sql(table_naem, engine, index=False, if_exists='append')t2 = time.time()  # 时间戳 单位秒print('数据插入结束时间:{0}'.format(t2))print('成功插入数据%d条,'%len(data1), '耗费时间:%.5f秒。'%(t2-t1))

sqlalchemy+pymssql连接sqlserver的时候注意坑:要指定数据库编码,slqserver创建的数据库默认是GBK编码。

2.6 完整调用代码

'''
批量处理所有excel数据
'''
# 数据文件都存储在某个指定目录下,如:
files_path = './data/'
bf_path = './process/'# 获取当前目录下所有文件名称
# files = os.listdir(files_path)
# files# 表名:附件excel名
data_dict = {'testa': ['test1.xls', 'test2.xls'], 'testb': ['test3.xls'], 'testc': ['test4.xls']
}# 选取附件中的指定列,只存入指定列数据
columns_a = ['S/No', 'SOID #', 'Current MileStone', 'Store In Date Time']
columns_b = ['Received Part Serial No', 'Received Product Category', 'Received Part Desc']
columns_c = ['From Loc', 'Orig Dispoition Code']columns = [columns_a, columns_b, columns_c]
flag = 0  # 列选择标记# 遍历字典 合并相关excel 然后处理数据后,存入sql
for k,v in data_dict.items():table_name = kdata = merge_excel(v, files_path)# 1、处理数据if 'SOID #' not in data.columns:# 不包含要处理的列,则直接简单去重后、存入数据库data.drop_duplicates(inplace=True)else:# 特别处理数据data = process_data(data)# 2、存储数据# 保险起见 本地也存一份data.to_excel(bf_path+table_name+'.xls')# 存储到数据库data_to_sql(data, table_name, columns[flag])flag+=1

资讯

Meta开发AI语音助手,助力元宇宙

技术

霸占CSDN榜一的20个Python用例

技术

20个Pandas数据实战案例,干货多

资讯

安全隐患:神经网络可以隐藏恶意软件

分享

点收藏

点点赞

点在看

Python 批量处理 Excel 数据后,导入 SQL Server相关推荐

  1. Python批量处理Excel数据后,导入SQL Server

    1.前言 2.开始动手动脑 2.1 拆解+明确需求 2.2 安装第三方包 2.3 读取excel数据 2.4 特殊数据数据处理 2.5 其他需求 2.6 完整调用代码 3.后言后语 1.前言 今天我们 ...

  2. 将Excel文件数据库导入SQL Server

    将Excel文件数据库导入SQL Server的三种方案//方案一: 通过OleDB方式获取Excel文件的数据,然后通过DataSet中转到SQL Server openFileDialog = n ...

  3. python批量处理excel数据_Python批量处理Excel,真香(超实用!)

    本文介绍了利用Python批量处理Excel文件的一种方法,超实用,超简单.轻松可实现,节省时间不只一点点.文章不长,功能超强. 上菜. 某一天,老板丢个我一个任务.需要将400多张表按照一定条件进行 ...

  4. .unl 文件 导入 mysql,informix导出的unl格式数据怎么导入sql server 2008里呢

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 上面问题解决了 一个新问题来了....>>>>> 错误 0xc0202009: 数据流任务 1: SSIS 错误代码 DTS ...

  5. C#将Excel数据表导入SQL数据库的两种方法(转)

    最近用写个winform程序想用excel 文件导入数据库中,网上寻求办法,找到了这个经过尝试可以使用. 方法一: 实现在c#中可高效的将excel数据导入到sqlserver数据库中,很多人通过循环 ...

  6. python接入excel_python 生成数据后导入 excel

    前言 在我们日常测试中,有时候需要造一些基础数据,比如,笔者想造 10 条数据,每条数据显示姓名和年龄,自然,少量数据我们可以在 Excel 中手动输入,但我们也可以通过简单的脚本来实现 第一步:确保 ...

  7. python批量修改excel数据_/python批量修改excel工作薄

    你好,怎么用Python对一个文件夹里包含多个Excel子文件进行批量修改某一单元格(是合并的)? 工作中经常用到Excel多事情都重复处理,比如每日报,每周的周报,各种数据表,这种固定的表其实都是6 ...

  8. python处理大量excel数据-python如何批量处理excel数据?

    python如何批量处理excel数据? python批量处理excel数据的方法: excel的内容需要有规律,python才能按顺序读取出来. 比如按行按列读取. 一.安装xlrd模块 到pyth ...

  9. python怎么批量处理数据_python如何批量处理excel数据?_后端开发

    php赋值运算符有哪些_后端开发 php赋值运算符有:1.[=]赋值运算符:2.[+=]加运算符:3.[-=]减运算符:4.[*=]乘运算符:5.[/=]除运算符:6.[.=]连接字符运算符:7.[% ...

最新文章

  1. 在互联网公司说女生备孕,就像跟你女朋友说你不行一个性质!
  2. 如何使用Azure ML Studio开启机器学习
  3. 无人驾驶还不如一个导盲犬可靠吗
  4. 访问Storm ui界面,出现Nimbus Summary或Supervisor Summary时有时无的问题解决(图文详解)...
  5. spark 不同模式用途_Spark 的四种模式
  6. 云存储精华问答 | 如何选择云迁移策略?
  7. C++Primer学习之二#define,const,constexpr
  8. 看我出招之:svchost.exe文件删不得
  9. 大数据之-Hadoop完全分布式_集群下_单个节点启动_一个一个启动集群节点---大数据之hadoop工作笔记0035
  10. python 计算机程序设计-某高校计算机编程教授教你如何快速入门python,一文带你进入编程...
  11. 2021 年百度之星·程序设计大赛 - 初赛二 1005 水题(贪心结论)
  12. Xcode无法识别真机
  13. 通信原理-通信系统的组成
  14. 抢椅子游戏java_抢椅子游戏作文(精选10篇)
  15. java 生成水印_Java实现图片生成水印
  16. 什么是HTML5的媒体查询功能
  17. GEE报错Tile error: Error in map(ID=198102T01):Element.copyProperties: The source parameter is require
  18. 开源软件架构 zeromq
  19. 数字化门店管理|如何让门店数字化管理,更加贴合日常运营细节?
  20. 【硬件设计的工具、计算器】

热门文章

  1. 软件测试培训分享:软件测试的职业发展方向有哪些
  2. UI设计培训之UI设计系统知识
  3. c语言考试经典编程题目及答案,经典练习C语言编程的题目及答案整理
  4. Centos 7环境下源码安装PostgreSQL数据库
  5. oracle 工具:tkprof
  6. 新产品发布与A轮2000万美元 双喜临门后GrowingIO还要做什么
  7. HDOJ_ACM_数塔
  8. sont表示元素在存入集合时进行了排序,数据遍历的结果是按某个排序规则输出的
  9. 电子工程师必须掌握的20个模拟电路
  10. 论文:Multi-Objective Modified Grey Wolf Optimizer for Optimal Power Flow-最优潮流