前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手把手教你使用Pandas从Excel文件中提取满足条件的数据并生成新的文件(附源码)

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

作者头像
Python进阶者
发布2022-06-05 09:19:20
3.2K0
发布2022-06-05 09:19:20
举报

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

大家好,我是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点的数据就会作为重复的数据而删除。本来应该是89点各取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 -------------------

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python爬虫与数据挖掘 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言
  • 二、实现过程
    • 方法一:分别取日期与小时,按照日期和小时删除重复项
      • 方法二:把日期中的分秒替换为0
        • 方法三:对日期时间按照小时进行分辨
          • 方法四:对日期时间按照小时进行分辨
            • 方法五:对日期时间进行重新格式,并按照新的日期时间删除
              • 小总结
                • 方法六:使用openpyxl处理
                • 三、总结
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档