Python處理Excel文件并與數據庫匹配做拼接

Python處理Excel文件并與數據庫匹配做拼接

需求:Python處理Excel中數據并于數據庫交互匹配得到賬號信息等其他操作

Python實現

import os
import pandas as pd
import pymssql
import warnings
import time# 提取速率函數
def extract_broadband_speed(speed):if pd.notnull(speed) and 'M' in str(speed):return str(speed).split('M')[0] + 'M'else:return ''# 拼接工單標題函數
def concatenate_with_dash(row):product_type = row.get('產品類型')workorder_type = row.get('工單類型')access_type = row.get('方式')broadband_speed = row.get('速率提取')if workorder_type in ['改', '其他']:if product_type == '寬帶':return f"{product_type}-{broadband_speed}-{access_type}-{workorder_type}"else:return f"{product_type}-{workorder_type}"elif product_type == '寬帶':return f"{product_type}-{broadband_speed}-{access_type}-{workorder_type}機"else:return f"{product_type}-{workorder_type}機"# 清空文件夾下的所有Excel文件數據只保留一個表頭數據
def clear_data_in_excel_files(current_directory):# 獲取當前文件夾下的所有 Excel 文件files = [file for file in os.listdir(current_directory) if file.endswith('.xls') or file.endswith('.xlsx')]# 遍歷所有 Excel 文件并清空除第一行表頭外的數據for file in files:file_path = os.path.join(current_directory, file)  # 獲取文件的路徑df = pd.read_excel(file_path)  # 讀取 Excel 文件df = df.head(0)  # 保留第一行表頭df.to_excel(file_path, index=False, header=True)  # 將清空后的數據覆蓋寫入原 Excel 文件print(f"成功清空文件: {file}")print("成功清空所有 Excel 文件的除第一行表頭外的數據")def main():start_time = time.time()print("程序開始時間:", time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(start_time)))warnings.filterwarnings('ignore')  # 忽略警告# 數據庫連接信息server = '127.0.0.1'database = 'YD'username = 'sa'password = 'xyz@1234560'conn = pymssql.connect(server, username, password, database)# 執行 SQL 查詢sql_query = '''SELECT 地市, 人員名稱, [賬號]FROM [ZHB]'''# 讀取數據庫數據data = pd.read_sql(sql_query, conn)data.rename(columns={'人員名稱': '處理人'}, inplace=True)# 獲取當前工作目錄current_directory = os.getcwd()# 獲取當前文件夾下的所有文件files = [file for file in os.listdir(current_directory) if file.endswith('.xls')]# 統計各個工單類型的總數workorder_count = {}for file in files:file_path = os.path.join(current_directory, file)  # 獲取文件的路徑df0 = pd.read_excel(file_path)  # 讀取 Excel 文件df0['速率提取'] = df0['速率'].apply(extract_broadband_speed)df0['用戶品質-NEW'] = df0['速率提取'].apply(lambda x: '千兆' if x == '1000M' else '普通品質')df0['產品工單類型合并'] = df0.apply(concatenate_with_dash, axis=1).str.replace('裝機', '新裝')# 修改“區域屬性”列名內容,含有城市和鄉鎮的替換為城鎮df0['區域-修改'] = df0['區域'].fillna('城鎮').str.replace('城市', '城鎮').str.replace('鄉鎮', '城鎮')# 修改“是否沿街”列名中有內容的改成是,沒有內容的改成否df0['是否沿街-修改'] = df0['沿街'].apply(lambda x: '是' if pd.notnull(x) else '否')df0['開始時間'] = df0['預約上門時間'].apply(lambda x: str(x).split(' ~ ')[0].strip() if isinstance(x, str) else '')df0['結束時間'] = df0['預約上門時間'].apply(lambda x: str(x).split(' ~ ')[-1].strip() if isinstance(x, str) else '')print(f"成功讀取文件: {file}")# 統計各個工單類型的總數for workorder_type in df0['產品類型']:workorder_count[workorder_type] = workorder_count.get(workorder_type, 0) + 1# 使用 merge 進行數據匹配merged_df = pd.merge(df0, data[['地市', '處理人', '賬號']], on=['地市', '處理人'], how='left')# 打印每個產品類型的相關信息for idx, (product_type, group_data) in enumerate(merged_df.groupby('產品類型')):print(f"產品類型 {idx + 1}: {product_type}")filtered_data = merged_df[merged_df['產品類型'].isin(['ZW', 'TR'])]filtered_data.to_excel("源文件/ZW_TR數據合并.xlsx", index=False)print("成功將產品類型為 ZW_TR數據合并.xlsx")product_types = ['云', '門鈴', '喇叭', 'HM']hm_data = merged_df[merged_df['產品類型'].isin(product_types)]hm_data.to_excel("源文件/HM_數據.xlsx", index=False)# 將其它類型的數據分別保存到不同文件中other_data = merged_df[~merged_df['產品類型'].isin(['ZW', 'TR', '云', '門鈴', '喇叭', 'HM'])]for product_type, group_data in other_data.groupby('產品類型'):file_name = f"源文件/{product_type}_數據.xlsx"group_data.to_excel(file_name, index=False)print(f"成功將產品類型為 {product_type} 的數據導出到文件 {file_name}")print("成功將數據庫查詢結果匹配并拆分業務導出為Excel文件")# 遍歷目標文件夾下的所有 Excel 文件target_folder = '數據庫字段/'clear_data_in_excel_files(target_folder)for file_name in os.listdir(target_folder):file_path = os.path.join(target_folder, file_name)if file_name.endswith('.xlsx'):source_file_path = os.path.join('源文件/', file_name)if os.path.isfile(source_file_path):df_source = pd.read_excel(source_file_path)df_target = pd.read_excel(file_path)for source_col, target_col in [('施工單編碼', '編碼'),('施工單編碼', 'boss號'),('產品工單類型合并', '工單標題'),('市', '市'),('縣', '縣'),('接入方式', '接入方式'),('受理時間', '受理時間'),('派單時間', '派單時間'),('歸檔時間', '歸檔時間'),('預約上門時間', '前臺預約時間'),('處理人', '施工人員'),# 字段添加('寬帶速率', '寬帶速率'),('寬帶套餐資費', '套餐信息'),('開始時間', '預約上門時間'),('區域-修改', '區域'),('是否沿街-修改', '沿街商鋪'),('用戶品質-NEW', '品質'),]:if source_col in df_source.columns and target_col in df_target.columns:df_target[target_col] = df_source[source_col]if 'ZW_TR數據合并.xlsx' in source_file_path:if 'ZW資費' in df_source.columns and '信息' in df_target.columns:df_target['信息'] = df_source['ZW資費']df_target.to_excel(file_path, index=False)print(f"成功將字段復制到文件 {file_path} 中")# 打印工單類型的總數print("產品類型總數:")for workorder_type, count in workorder_count.items():print(f"{workorder_type}: {count}")end_time = time.time()print("程序結束時間:", time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(end_time)))run_time = end_time - start_timeprint("程序運行耗時:%0.2f" % run_time, "s")# 提示用戶按任意鍵退出程序input("按任意鍵退出程序")if __name__ == "__main__":main()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210253.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210253.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210253.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【外觀模式】SpringBoot集成mail發送郵件

前言 發送郵件功能,借鑒 剛果商城,根據文檔及項目代碼實現。整理總結便有了此文,文章有不對的點,請聯系博主指出,請多多點贊收藏,您的支持是我最大的動力~ 發送郵件功能主要借助 mail、freemarker以及rocke…

Java 泛型相關知識

什么是泛型? Java 泛型(generics)是JDK5中引入的一種參數化類型特性。 為什么使用泛型,使用泛型的好處? 代碼更健壯(只要編譯期沒有警告,那么運行期就不會出現 ClassCastException)代碼更簡潔(不用強轉)代碼更靈活,復用什么是參數化類型: 把類型當參數一樣傳遞<…

C語言絕對值得一看的常識講解:柔性數組補充篇

今天突然看到一個比較特別的知識點——柔性數組。它是在C99中出現的一種特別的數組&#xff0c;具體是指結構體中的最后一個元素允許是未知大小的數組&#xff0c;這就叫做『柔性數組』成員。 目錄 1.柔性數組的定義 2.柔性數組的特點 3.柔性數組的使用舉例 4.柔性數組的優…

React基礎語法整理

安裝&#xff1a; yarn create react-app reatc-lesson --template typescript yarn create 創建一個react-app的應用 項目名稱 typescript 的模板react-app 官方地址 https://create-react-app.bootcss.com/docs/adding-typescriptreact 語法文檔 https://zh-hans.react.dev…

Vue筆記(一)基礎

VUE 官方文檔&#xff1a;https://cn.vuejs.org/ 創建VUE項目 前提&#xff1a;已安裝 16.0 或更高版本的 Node.js 進入要創建的目錄&#xff0c;執行命令&#xff1a;npm create vuelatest 安裝依賴&#xff0c;啟動&#xff1a; //進入項目目錄&#xff0c;運行命令安裝依賴…

基于Vue框架的電子商城購物平臺小程序的設計與開發

基于JavaWebSSMVue電子商城購物平臺小程序系統的設計和實現 源碼獲取入口KaiTi 報告/Ren務書Lun文目錄前言主要技術系統設計功能截圖訂閱經典源碼專欄Java項目精品實戰案例《500套》 源碼獲取 源碼獲取入口 KaiTi 報告/Ren務書 一、選題的目的和意義 自從微信推出了微信小程序…

使用命令行移除VSAN中故障磁盤

原創作者&#xff1a;運維工程師 謝晉 使用命令行移除VSAN中故障磁盤 前提故障盤移除 前提 客戶有套VSAN環境內有一臺服務器的磁盤組出現了一塊故障的數據盤&#xff0c;但該盤已經處于完全掉線狀態&#xff0c;無法進行正常移除。如下圖&#xff1a; 如果遇到這種情況&am…

P9 LinuxC 進程概述 終端啟動的程序父進程是終端

前言 &#x1f3ac; 個人主頁&#xff1a;ChenPi &#x1f43b;推薦專欄1: 《C_ChenPi的博客-CSDN博客》??? &#x1f525; 推薦專欄2: 《Linux C應用編程&#xff08;概念類&#xff09;_ChenPi的博客-CSDN博客》??? &#x1f6f8;推薦專欄3: ??????《鏈表_ChenP…

【1】一文讀懂PyQt簡介和環境搭建

目錄 1. PyQt簡介 1.1. Qt 1.2. PyQt 1.3. 關于PyQt和PySide 2. 通過pip安裝PyQt5 3. 無法運行處理 4. VSCode配置PYQT插件 PyQt官網:Riverbank Computing | Introduction 1. PyQt簡介 PyQt是一套Python的GUI開發框架,即圖形用戶界面開發框架。 Python中經常使用的GU…

FreeRTOS的內存管理方法(超詳細)

內存管理 我們知道每次創建任務、隊列、互斥鎖、軟件定時器、信號量或事件組時&#xff0c;RTOS 內核都需要 RAM &#xff0c; RAM 可以從 RTOS API 對象創建函數內的 RTOS 堆自動動態分配&#xff0c; 或者由應用程序編寫者提供。 如果 RTOS 對象是動態創建的&#xff0c;那么…

Leetcode—2646.最小化旅行的價格總和【困難】

2023每日刷題&#xff08;五十三&#xff09; Leetcode—2646.最小化旅行的價格總和 算法思想 看靈神的 實現代碼 class Solution { public:int minimumTotalPrice(int n, vector<vector<int>>& edges, vector<int>& price, vector<vector&l…

發現數學之美--微積分的起源和用途(一文搞懂微積分)

數學&#xff0c;改變世界的基石。微積分十九世紀的三大自然發現之一&#xff0c;迪卡爾建立了解析幾何&#xff0c;把數與圖結合在一起&#xff0c;微積分的發現與創立&#xff0c;是數學新的里程碑&#xff0c;解決了常規方法無法解決的問題&#xff0c;是一次偉大的革命。迪…

服務器數據損壞了有辦法修復嗎 ?

對于企業網站來說&#xff0c;數據庫往往是服務器中最核心的部分&#xff0c;所以一旦數據庫發生損壞&#xff0c;將會給企業帶來巨大的損失&#xff0c;因 此數據庫的數據恢復功能變得越來越重要了。在服務器運行過程中&#xff0c;由于斷電、操作不當或者是客觀原因損壞到服務…

git安裝和配置

git安裝和配置 一、軟件介紹 Git是一個免費開源的分布式版本控制系統&#xff0c;旨在快速高效地處理從小型到大型項目的所有內容。 Git易于學習&#xff0c;占地面積小&#xff0c;性能閃電般快。它以廉價的本地分支、方便的暫存區域和多個工作流等功能勝過了Subversion、C…

linux 常用指令目錄大綱

Linux下的Signal信號處理及詳解&#xff0c;test ok-CSDN博客 Linux下怎樣判斷一個binary是否可以debug//test ok_感知算法工程師的博客-CSDN博客 linux file命令的用法//test ok-CSDN博客 linux下生成core dump方法與gdb解析core dump文件//test ok-CSDN博客 linux readel…

【論文閱讀】Reachability and distance queries via 2-hop labels

Cohen E, Halperin E, Kaplan H, et al. Reachability and distance queries via 2-hop labels[J]. SIAM Journal on Computing, 2003, 32(5): 1338-1355. Abstract 圖中的可達性和距離查詢是許多應用的基礎&#xff0c;從地理導航系統到互聯網路由。其中一些應用程序涉及到巨…

第7節:Vue3 動態綁定多個屬性

可以使用v-bind指令將多個屬性動態綁定到元素上。以下是一個簡單的實例&#xff1a; <template><view class"container"><text v-bind"dynamicProps">{{ message }}</text><button click"toggleActive">切換激活…

金南瓜SECS/GEM C# SDK 快速使用指南

本文對如何使用金南瓜SECS/GEM C# SDK 快速創建一個滿足SECS/GEM通信要求的應用程序&#xff0c;只需簡單3步完成。 第一步&#xff1a;創建C# .NET程序 示例使用Visual Studio 2010&#xff0c;使用者可以選擇更高級版本 Visual Studio 第二步&#xff1a;添加DLL庫引用&am…

圖論-并查集

并查集(Union-find Sets)是一種非常精巧而實用的數據結構,它主要用于處理一些不相交集合的合并問題.一些常見的用途有求連通子圖,求最小生成樹Kruskal算法和最近公共祖先(LCA)等. 并查集的基本操作主要有: .1.初始化 2.查詢find 3.合并union 一般我們都會采用路徑壓縮 這樣…

git標簽的管理與思考

git 標簽管理 git 如何打標簽呢&#xff1f; 標簽是什么? 標簽 相當于一個 版本管理的一個貼紙&#xff0c;隨時 可以通過標簽 切換到 這個版本的狀態 &#xff0c; 有人可能有疑問 git commit 就可以知道 代碼的改動了&#xff0c; 為啥還需要標簽來管理呢&#xff1f; …