手把手教你使用Pandas从Excel文件中提取满足条件的数据并生成新的文件(附源码)

您所在的位置:网站首页 excel怎么选出符合条件的数据 手把手教你使用Pandas从Excel文件中提取满足条件的数据并生成新的文件(附源码)

手把手教你使用Pandas从Excel文件中提取满足条件的数据并生成新的文件(附源码)

2024-06-17 20:53| 来源: 网络整理| 查看: 265

我本将心向明月,奈何明月照沟渠。

大家好,我是Python进阶者。

一、前言

前几天在Python星耀交流群有个叫【蒋卫涛】的粉丝问了一个Python自动化办公的题目,这里拿出来给大家分享。

下面是他的原始数据。

二、实现过程

这里【月神】、【瑜亮老师】分别给出了5种可行的方法,分享给大家。

方法一:分别取日期与小时,按照日期和小时删除重复项代码语言:javascript复制import pandas as pd excel_filename = '数据.xlsx' df = pd.read_excel(excel_filename) # print(df) # 方法一:分别取日期与小时,按照日期和小时删除重复项 df['day'] = df['SampleTime'].dt.day # 提取日期列 df['hour'] = df['SampleTime'].dt.hour # 提取小时列 df = df.drop_duplicates(subset=['day', 'hour']) # 删除重复项 # 把筛选结果保存为excel文件 df.to_excel('数据筛选结果2.xlsx') 方法二:把日期中的分秒替换为0代码语言:javascript复制import pandas as pd excel_filename = '数据.xlsx' df = pd.read_excel(excel_filename) # 方法二:把日期中的分秒替换为0 SampleTime_new = df['SampleTime'].map(lambda x: x.replace(minute=0, second=0)) data = df[SampleTime_new.duplicated() == False] print(df) # 把筛选结果保存为excel文件 df.to_excel('数据筛选结果2.xlsx') 方法三:对日期时间按照小时进行分辨代码语言:javascript复制import pandas as pd excel_filename = '数据.xlsx' df = pd.read_excel(excel_filename) # 方法三:对日期时间按照小时进行分辨 SampleTime_new = df['SampleTime'].dt.floor(freq='H') df = df[SampleTime_new.duplicated() == False] print(df) # 把筛选结果保存为excel文件 df.to_excel('数据筛选结果2.xlsx') 方法四:对日期时间按照小时进行分辨代码语言:javascript复制import pandas as pd excel_filename = '数据.xlsx' df = pd.read_excel(excel_filename) # 方法四:对日期时间按照小时进行分辨 SampleTime_new = df['SampleTime'].dt.to_period(freq='H') df = df[SampleTime_new.duplicated() == False] print(df) # 把筛选结果保存为excel文件 df.to_excel('数据筛选结果2.xlsx') 方法五:对日期时间进行重新格式,并按照新的日期时间删除代码语言:javascript复制import pandas as pd excel_filename = '数据.xlsx' df = pd.read_excel(excel_filename) # 方法五:对日期时间进行重新格式,并按照新的日期时间删除重复项(会引入新列) df['new'] = df['SampleTime'].dt.strftime('%Y-%m-%d %H') df = df.drop_duplicates(subset=['new']) print(df) # 把筛选结果保存为excel文件 df.to_excel('数据筛选结果2.xlsx') 小总结

前面这5个方法有相似的地方,比如方法1和方法5都是把日期只取到小时,方法3和方法4都是按照小时进行分辨,而方法1,2和5其实本质上都是把分钟和秒变成0,比如方法5中这样写的话,就和方法2是一样的df['new'] = df['SampleTime'].dt.strftime('%Y-%m-%d %H:00:00')

方法2和3是【月神】提供的方法,方法1,4,5是【瑜亮老师】提供的方法。

【月神】使用了floor向下取整,也就是抹去零头。本来【瑜亮老师】还想用ceil向上取整试试,结果发现不对,整点的会因为向上取整而导致数据缺失,比如8:15,向上取整就是9点,如果同一天中刚好9:00也有一条数据,那么这个9点的数据就会作为重复的数据而删除。本来应该是8点9点各取1条数据的,结果变成了只取8点这1条。包括round,也会因为四舍五入(这里就不纠结了)导致信息缺失更多。

方法六:使用openpyxl处理

这里我本来还想用openpyxl进行实现,但是却卡壳了,只能提取出24条数据出来,先放这里做个记录吧,哪天突然间灵光了,再补充好了。

代码语言:javascript复制from openpyxl import load_workbook, Workbook from datetime import datetime # 打开数据工作簿 workbook = load_workbook('数据.xlsx') # 打开工作表 sheet = workbook.active time_column = sheet['C'] row_lst = [] date_lst = [] hour_lst = [] for cell in time_column: if cell.value != "SampleTime" and cell.value != None: # print(cell.value.date()) if cell.value.date() not in date_lst: date_lst.append(cell.value.date()) # row_lst.append(cell.row) print(date_lst) # if all(cell.value != "SampleTime", cell.value != None, cell.value.date() == date, cell.value.hour not in hour_lst): for date in date_lst: # print(date) for cell in time_column: # if all((cell.value != "SampleTime", cell.value != None, cell.value.date() == date, cell.value.hour not in hour_lst)): # row_lst.append(cell.row) if cell.value != "SampleTime" and cell.value != None: if cell.value.date() == date: if cell.value.hour not in hour_lst: hour_lst.append(cell.value.hour) row_lst.append(cell.row) hour_lst = [] print(hour_lst) # 将满足要求的数据写入到新表 new_workbook = Workbook() new_sheet = new_workbook.active # 创建和原数据 一样的表头(第一行) header = sheet[1] header_lst = [] for cell in header: header_lst.append(cell.value) new_sheet.append(header_lst) # 从旧表中根据行号提取符合条件的行,并遍历单元格获取值,以列表形式写入新表 for row in row_lst: data_lst = [] for cell in sheet[row]: data_lst.append(cell.value) new_sheet.append(data_lst) # 最后切记保存 new_workbook.save('新表.xlsx') print("满足条件的新表保存完成!")

这个方法就是遍历date,然后遍历一次之后,将hour置空,如此反复,这样就可以每次取到每天唯一的某一个小时的一个时间。

三、总结

大家好,我是Python进阶者。这篇文章主要分享了使用Pandas从Excel文件中提取满足条件的数据并生成新的文件的干货内容,文中提供了5个方法,行之有效。如果你还有其他写法,也欢迎大家积极尝试,一起学习,成功的话记得分享给我噢!

最后感谢粉丝【蒋卫涛】提问,感谢【月神】、【瑜亮老师】给出的代码和具体解析,感谢粉丝【dcpeng】、【冯诚】、【艾希·觉罗】、【多隆】、【憶💫 逍遥】、【问题不大】等人参与学习交流。

小伙伴们,快快用实践一下吧!

------------------- End -------------------



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3