我本将心向明月,奈何明月照沟渠。
大家好,我是Python进阶者。
前几天在Python星耀交流群有个叫【蒋卫涛】的粉丝问了一个Python自动化办公的题目,这里拿出来给大家分享。
下面是他的原始数据。
这里【月神】、【瑜亮老师】分别给出了5种可行的方法,分享给大家。
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')
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')
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')
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')
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
进行实现,但是却卡壳了,只能提取出24条数据出来,先放这里做个记录吧,哪天突然间灵光了,再补充好了。
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 -------------------
本文分享自 Python爬虫与数据挖掘 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!