手把手教你使用Pandas從Excel文件中提取滿足條件的數(shù)據(jù)并生成新的文件(附源碼)
回復(fù)“書籍”即可獲贈(zèng)Python從入門到進(jìn)階共10本電子書
大家好,我是Python進(jìn)階者。
一、前言
前幾天在Python星耀交流群有個(gè)叫【蔣衛(wèi)濤】的粉絲問(wèn)了一個(gè)Python自動(dòng)化辦公的題目,這里拿出來(lái)給大家分享。
下面是他的原始數(shù)據(jù)。

二、實(shí)現(xiàn)過(guò)程
這里【月神】、【瑜亮老師】分別給出了5種可行的方法,分享給大家。
方法一:分別取日期與小時(shí),按照日期和小時(shí)刪除重復(fù)項(xiàng)
import?pandas?as?pd
excel_filename?=?'數(shù)據(jù).xlsx'
df?=?pd.read_excel(excel_filename)
#?print(df)
#?方法一:分別取日期與小時(shí),按照日期和小時(shí)刪除重復(fù)項(xiàng)
df['day']?=?df['SampleTime'].dt.day???#?提取日期列
df['hour']?=?df['SampleTime'].dt.hour?????#?提取小時(shí)列
df?=?df.drop_duplicates(subset=['day',?'hour'])??#?刪除重復(fù)項(xiàng)
#?把篩選結(jié)果保存為excel文件
df.to_excel('數(shù)據(jù)篩選結(jié)果2.xlsx')
方法二:把日期中的分秒替換為0
import?pandas?as?pd
excel_filename?=?'數(shù)據(jù).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)
#?把篩選結(jié)果保存為excel文件
df.to_excel('數(shù)據(jù)篩選結(jié)果2.xlsx')
方法三:對(duì)日期時(shí)間按照小時(shí)進(jìn)行分辨
import?pandas?as?pd
excel_filename?=?'數(shù)據(jù).xlsx'
df?=?pd.read_excel(excel_filename)
#?方法三:對(duì)日期時(shí)間按照小時(shí)進(jìn)行分辨
SampleTime_new?=?df['SampleTime'].dt.floor(freq='H')
df?=?df[SampleTime_new.duplicated()?==?False]
print(df)
#?把篩選結(jié)果保存為excel文件
df.to_excel('數(shù)據(jù)篩選結(jié)果2.xlsx')
方法四:對(duì)日期時(shí)間按照小時(shí)進(jìn)行分辨
import?pandas?as?pd
excel_filename?=?'數(shù)據(jù).xlsx'
df?=?pd.read_excel(excel_filename)
#?方法四:對(duì)日期時(shí)間按照小時(shí)進(jìn)行分辨
SampleTime_new?=?df['SampleTime'].dt.to_period(freq='H')
df?=?df[SampleTime_new.duplicated()?==?False]
print(df)
#?把篩選結(jié)果保存為excel文件
df.to_excel('數(shù)據(jù)篩選結(jié)果2.xlsx')
方法五:對(duì)日期時(shí)間進(jìn)行重新格式,并按照新的日期時(shí)間刪除
import?pandas?as?pd
excel_filename?=?'數(shù)據(jù).xlsx'
df?=?pd.read_excel(excel_filename)
#?方法五:對(duì)日期時(shí)間進(jìn)行重新格式,并按照新的日期時(shí)間刪除重復(fù)項(xiàng)(會(huì)引入新列)
df['new']?=?df['SampleTime'].dt.strftime('%Y-%m-%d?%H')
df?=?df.drop_duplicates(subset=['new'])
print(df)
#?把篩選結(jié)果保存為excel文件
df.to_excel('數(shù)據(jù)篩選結(jié)果2.xlsx')
小總結(jié)
前面這5個(gè)方法有相似的地方,比如方法1和方法5都是把日期只取到小時(shí),方法3和方法4都是按照小時(shí)進(jìn)行分辨,而方法1,2和5其實(shí)本質(zhì)上都是把分鐘和秒變成0,比如方法5中這樣寫的話,就和方法2是一樣的df['new'] = df['SampleTime'].dt.strftime('%Y-%m-%d %H:00:00')
方法2和3是【月神】提供的方法,方法1,4,5是【瑜亮老師】提供的方法。
【月神】使用了floor向下取整,也就是抹去零頭。本來(lái)【瑜亮老師】還想用ceil向上取整試試,結(jié)果發(fā)現(xiàn)不對(duì),整點(diǎn)的會(huì)因?yàn)橄蛏先≌鴮?dǎo)致數(shù)據(jù)缺失,比如8:15,向上取整就是9點(diǎn),如果同一天中剛好9:00也有一條數(shù)據(jù),那么這個(gè)9點(diǎn)的數(shù)據(jù)就會(huì)作為重復(fù)的數(shù)據(jù)而刪除。本來(lái)應(yīng)該是8點(diǎn)9點(diǎn)各取1條數(shù)據(jù)的,結(jié)果變成了只取8點(diǎn)這1條。包括round,也會(huì)因?yàn)樗纳嵛迦耄ㄟ@里就不糾結(jié)了)導(dǎo)致信息缺失更多。
方法六:使用openpyxl處理
這里我本來(lái)還想用openpyxl進(jìn)行實(shí)現(xiàn),但是卻卡殼了,只能提取出24條數(shù)據(jù)出來(lái),先放這里做個(gè)記錄吧,哪天突然間靈光了,再補(bǔ)充好了。
from?openpyxl?import?load_workbook,?Workbook
from?datetime?import?datetime
#?打開數(shù)據(jù)工作簿
workbook?=?load_workbook('數(shù)據(jù).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)
#?將滿足要求的數(shù)據(jù)寫入到新表
new_workbook?=?Workbook()
new_sheet?=?new_workbook.active
#?創(chuàng)建和原數(shù)據(jù)?一樣的表頭(第一行)
header?=?sheet[1]
header_lst?=?[]
for?cell?in?header:
????header_lst.append(cell.value)
new_sheet.append(header_lst)
#?從舊表中根據(jù)行號(hào)提取符合條件的行,并遍歷單元格獲取值,以列表形式寫入新表
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("滿足條件的新表保存完成!")
這個(gè)方法就是遍歷date,然后遍歷一次之后,將hour置空,如此反復(fù),這樣就可以每次取到每天唯一的某一個(gè)小時(shí)的一個(gè)時(shí)間。

三、總結(jié)
大家好,我是Python進(jìn)階者。這篇文章主要分享了使用Pandas從Excel文件中提取滿足條件的數(shù)據(jù)并生成新的文件的干貨內(nèi)容,文中提供了5個(gè)方法,行之有效。如果你還有其他寫法,也歡迎大家積極嘗試,一起學(xué)習(xí),成功的話記得分享給我噢!
最后感謝粉絲【蔣衛(wèi)濤】提問(wèn),感謝【月神】、【瑜亮老師】給出的代碼和具體解析,感謝粉絲【dcpeng】、【馮誠(chéng)】、【艾?!びX羅】、【多隆】、【憶?? 逍遙】、【問(wèn)題不大】等人參與學(xué)習(xí)交流。
小伙伴們,快快用實(shí)踐一下吧!如果在學(xué)習(xí)過(guò)程中,有遇到任何Python問(wèn)題,歡迎加我好友,我拉你進(jìn)Python學(xué)習(xí)交流群共同探討學(xué)習(xí)。
-------------------?End?-------------------
往期精彩文章推薦:

歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Python學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群】
萬(wàn)水千山總是情,點(diǎn)個(gè)【在看】行不行
