Python數(shù)據(jù)分析及應(yīng)用 課件 第7-9章 Pandas數(shù)據(jù)分析、時間序列分析、Python可視化分析_第1頁
Python數(shù)據(jù)分析及應(yīng)用 課件 第7-9章 Pandas數(shù)據(jù)分析、時間序列分析、Python可視化分析_第2頁
Python數(shù)據(jù)分析及應(yīng)用 課件 第7-9章 Pandas數(shù)據(jù)分析、時間序列分析、Python可視化分析_第3頁
Python數(shù)據(jù)分析及應(yīng)用 課件 第7-9章 Pandas數(shù)據(jù)分析、時間序列分析、Python可視化分析_第4頁
Python數(shù)據(jù)分析及應(yīng)用 課件 第7-9章 Pandas數(shù)據(jù)分析、時間序列分析、Python可視化分析_第5頁
已閱讀5頁,還剩155頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1Python數(shù)據(jù)分析及應(yīng)用第七章Pandas數(shù)據(jù)分析目錄

7.1Pandas數(shù)據(jù)結(jié)構(gòu)7.2DataFrame數(shù)據(jù)的基本操作7.3數(shù)據(jù)的導(dǎo)入與導(dǎo)出7.4數(shù)據(jù)的預(yù)處理7.5數(shù)據(jù)分組統(tǒng)計7.6創(chuàng)建透視表和交叉表(1)知識目標(biāo):掌握Pandas的兩種數(shù)據(jù)結(jié)構(gòu)及其基本操作、掌握DataFrame數(shù)據(jù)的基本操作,即數(shù)據(jù)的查改增刪、掌握Pandas的數(shù)據(jù)導(dǎo)入與導(dǎo)出操作、掌握數(shù)據(jù)分析前的常用預(yù)處理操作、掌握Pandas中的數(shù)據(jù)分組、聚合以及統(tǒng)計操作、掌握Pandas中數(shù)據(jù)透視表和交叉表的創(chuàng)建方法。(2)技能目標(biāo):具備一定的數(shù)據(jù)分析和處理能力,能夠運用Pandas高效地處理數(shù)據(jù)集、能夠利用Pandas進行數(shù)據(jù)統(tǒng)計分析,如描述性統(tǒng)計、分組統(tǒng)計等,為數(shù)據(jù)分析和數(shù)據(jù)挖掘提供有力支持;具備一定的問題解決能力,面對實際的數(shù)據(jù)處理問題時,能夠迅速分析并找到解決方案,利用Pandas工具集進行實踐。(3)素質(zhì)目標(biāo):保持對新技術(shù)和新方法的關(guān)注,持續(xù)學(xué)習(xí);在處理復(fù)雜數(shù)據(jù)時,能夠保持清晰的邏輯思維,有條理地進行數(shù)據(jù)分析和處理;數(shù)據(jù)處理工作往往繁瑣且需要高度細(xì)致,能夠保持耐心和細(xì)心,確保數(shù)據(jù)處理的準(zhǔn)確性和完整性。3學(xué)習(xí)目標(biāo)

銷售數(shù)據(jù)如同一面鏡子,清晰地映射出顧客需求、市場變化以及經(jīng)營策略的有效性。為提升顧客滿意度,增強市場競爭力,對銷售數(shù)據(jù)進行分析顯得很重要。本章將圍繞小型商店的近期銷售數(shù)據(jù),通過pandas的數(shù)據(jù)分析技術(shù),分析哪些商品受顧客青睞、每天的銷售總額、每類商品的售出數(shù)量有何變化等。

通過本章的學(xué)習(xí),您將掌握如何使用Pandas輕松應(yīng)對各種數(shù)據(jù)處理挑戰(zhàn),系統(tǒng)地學(xué)習(xí)Pandas的基礎(chǔ)知識,從核心數(shù)據(jù)結(jié)構(gòu)DataFrame和Series的創(chuàng)建與操作開始,逐步深入到數(shù)據(jù)的導(dǎo)入與導(dǎo)出、清洗與轉(zhuǎn)換、聚合與篩選、排序與索引等高級功能。4本章導(dǎo)讀Pandas主要提供了兩種數(shù)據(jù)類型:Series和DataFrame,Series是一維數(shù)據(jù)結(jié)構(gòu),DataFrame是二維數(shù)據(jù)結(jié)構(gòu)。

在程序中要使用Pandas,首先需要導(dǎo)入該庫,同時為方便使用,在導(dǎo)入時通常為該庫起別名為“pd”,命令為:

importpandasaspd

在jupyternotebook中,可根據(jù)需要設(shè)置數(shù)據(jù)顯示的行列數(shù),通過調(diào)用pandas的set_option()方法來實現(xiàn),如以下命令可設(shè)置在jupyternotebook中最多顯示10行8列數(shù)據(jù),超出部分使用省略號替換。pd.set_option('display.max_rows',10)pd.set_option('display.max_columns',8)57.1Pandas數(shù)據(jù)結(jié)構(gòu)

Pandas中的Series類似于一維數(shù)組或列表,但功能更為強大。Series對象由索引(index)和數(shù)據(jù)(data)兩部分組成的,索引也稱為數(shù)據(jù)標(biāo)簽。索引用于標(biāo)識數(shù)據(jù)的位置,可以是自動生成的整數(shù),也可以是自定義的字符串等任意數(shù)據(jù)類型。數(shù)據(jù)部分則存儲了Series的實際值,可以是數(shù)值、字符串、布爾值等任意數(shù)據(jù)類型。67.1.1Series對象可以使用pandas的Series()函數(shù)創(chuàng)建Series對象,其基本語法為:pd.Series(data,index=None)data是必要參數(shù),指要放入Series中的數(shù)據(jù),可以是列表、數(shù)組、字典等。index是可選參數(shù),能夠自定義Series對象的索引,如果沒有指定索引,pandas會自動創(chuàng)建從0開始的整數(shù)索引。7(一)series的創(chuàng)建

實例7-1創(chuàng)建Series。importpandasaspddata1=[1,2,3,4,5]s1=pd.Series(data1)#使用列表創(chuàng)建Series,沒有指定索引print(s1)data2=[10,20,30,40,50]s2=pd.Series(data2,index=['A','B','C','D','E'])#創(chuàng)建Series,自定義索引print(s2)data3={'a':100,'b':200,'c':300,'d':400,'e':500}s3=pd.Series(data3)#使用字典創(chuàng)建Series,字典的鍵作為索引print(s3)

通過index屬性可以獲取Series對象的索引,values屬性可以獲取Series對象的數(shù)據(jù)值。同時,與字符串、列表等數(shù)據(jù)類型一樣,Series也支持索引和切片操作,可以通過索引來選擇或修改數(shù)據(jù),也可以通過切片獲取一段范圍內(nèi)的數(shù)據(jù),得到一個新的Series數(shù)據(jù)對象。8(二)series的常用操作

實例7-2series操作。importpandasaspddata1=[1,2,3,4,5]s1=pd.Series(data1)print('s1的索引:',s1.index)print('s1的數(shù)據(jù):',s1.values)print('s1索引為0的數(shù)據(jù):',s1[0])print('s1索引為1-3的數(shù)據(jù):\n',s1[1:4])DataFrame是類似于二維數(shù)組或表格(如excel)的對象,它包含一組有序的列,每一列的數(shù)據(jù)類型是相同的,但不同列可以是不同的值類型(字符串、數(shù)字、日期時間等)。DataFrame既有行索引,又有列索引,可以看作由Series組成的字典。DataFrame包括3個基本要素,分別是索引、列、數(shù)據(jù)。在DataFrame的許多操作中,都使用了axis這一參數(shù),用于指定操作是應(yīng)用于行的方向還是列的方向,axis=0指操作應(yīng)用于行,而axis=1指操作應(yīng)用于列。97.1.2

DataFrame對象axis=0axis=1索引(index)列名(columns)數(shù)據(jù)(data)DataFrame的創(chuàng)建可以通過多種方式實現(xiàn),最常用的是通過字典、列表、文件導(dǎo)入創(chuàng)建。使用字典創(chuàng)建DataFrame時,字典的鍵成為列名,字典的值(通常是列表或數(shù)組)成為對應(yīng)列的數(shù)據(jù)。使用列表創(chuàng)建DataFrame時,實際上是通過列表的列表,即二維列表來創(chuàng)建,并通過使用columns屬性指定列名。10(一)DataFrame的創(chuàng)建11實例7-3創(chuàng)建DataFrame。importpandasaspd#使用字典創(chuàng)建DataFramedata1={'Name':['Tom','Jerry','Mickey','Minnie'],'Age':[18,20,22,15],'City':['北京','上海','昆明','廣州']}df1=pd.DataFrame(data1)print(df1)#使用列表的列表創(chuàng)建DataFramedata2=[['Tom',18,'北京'],['Jerry',20,'上海'],['Mickey',22,'昆明'],['Minnie',15,'廣州']]df2=pd.DataFrame(data2,columns=['Name','Age','City'])print(df2)#使用字典創(chuàng)建DataFrame并自定義行索引df3=pd.DataFrame(data1,index=['A1','A2','A3','A4'])print(df3)12(二)DataFrame的常用屬性和方法13實例7-4DataFrame的常用屬性和方法。importpandasaspddata1={'Name':['Tom','Jerry','Mickey','Minnie'],'Age':[18,20,22,15],'City':['北京','上海','昆明','廣州']}df1=pd.DataFrame(data1)print('df1的行列數(shù):',df1.shape)print('df1每列的數(shù)據(jù)類型:\n',df1.dtypes)print('df1前2行:\n',df1.head(2))print('df1后3行:\n',df1.tail(3))print('df1中的隨機2行:\n',df1.sample(2))

本節(jié)將介紹對DataFrame數(shù)據(jù)的提取、增加、刪除、修改、條件檢索等內(nèi)容,使用相同的DataFrame進行操作,創(chuàng)建數(shù)據(jù)的代碼為:importpandasaspddata={'ID':['001','002','003','004','005','006'],'名稱':['蘋果','香皂','牛奶','香蕉','筆記本','辣條'],'價格':[4.99,10.5,3.5,6.4,8.0,2.5],'類型':['水果','日用品','食品','水果','學(xué)習(xí)用品','食品'],'庫存量':[20,50,10,8,30,15]}df=pd.DataFrame(data,index=['A','B','C','D','E','F'])147.2

DataFrame數(shù)據(jù)的基本操作157.2.1

數(shù)據(jù)的提取(一)行的提取1.使用索引提取行

格式為:DataFrame[a:b:k],a和b為行索引,k是步長(整數(shù),默認(rèn)為1)。a和b既可以自動行號,指提取從a行開始、到b行之前(不包含b行)、步長為k的行,如df[0:1]指提取df的第一行;也可以是自定義行索引,指提取從a行開始、到b行為止(包含b行)、步長為k的行,如df[’A’:’A’]也能提取df的第一行。實例7-5使用索引提取DataFrame行。print('df的前2行:\n',df[0:2])print('df的基數(shù)行:\n',df[0:6:2])print('df的C行到D行:\n',df['C':'D'])162.使用loc方法loc方法是根據(jù)索引值獲取行。loc[]的語法格式為:DataFrame.loc[行標(biāo)簽,列標(biāo)簽]第一個參數(shù)指定行標(biāo)簽名,第二個參數(shù)指定列標(biāo)簽名,兩個參數(shù)都可以是一個標(biāo)簽、?一個標(biāo)簽列表或者?一個范圍。如果要提取的是不連續(xù)的多行,應(yīng)將行標(biāo)簽名放入列表并傳到第一個參數(shù)中。實例7-6使用loc方法提取DataFrame行。print('索引為A的行(series形式):\n',df.loc['A'])print('索引為A的行(DataFrame形式):\n',df.loc[['A']])print('索引為A至C的行:\n',df.loc['A':'C'])print('索引為A或C的行:\n',df.loc[['A','C']])173.使用iloc方法

iloc方法根據(jù)自動行號訪問行。語法格式為:

DataFrame.iloc[行號,列號]第一個參數(shù)指定行號,第二個參數(shù)指定列號,兩個參數(shù)都可以是單個整數(shù)、?整數(shù)列表或?整數(shù)切片。

實例7-7使用iloc方法提取DataFrame行。print('行號為1的行(series形式):\n',df.iloc[1])print('行號為1的行(DataFrame形式):\n',df.iloc[[1]])print('行號3開始的所有行:\n',df.iloc[3:])print('行號為1-3的行:\n',df.iloc[1:4])print('行號為1,2,4的行:\n',df.iloc[[1,2,4]])

18(二)列的提取

1.使用列名提取列

DataFrame是帶有標(biāo)簽的二維數(shù)組,每個標(biāo)簽相當(dāng)于每列的列名,因此,只要以字典訪問某key的方式使用對應(yīng)的列名,就可以提取DataFrame中的單列。訪問多列數(shù)據(jù)時,需要將多個列名放入一個列表中。實例7-8使用列名提取列。print('ID列(series形式):\n',df['ID'])print('名稱和價格列:\n',df[['名稱','價格']])192.使用loc方法

loc方法是根據(jù)列名獲取列,按照loc[]的語法,第一個參數(shù)設(shè)置為:表示所有行,第二個參數(shù)設(shè)置為要提取的列標(biāo)簽,行標(biāo)簽和列標(biāo)簽之間用逗號隔開。實例7-9使用loc提取列。print('ID列(series形式):\n',df.loc[:,'ID'])print('名稱和價格列:\n',df.loc[:,['名稱','價格']])203.使用iloc方法iloc方法根據(jù)自動列號訪問列,按iloc[]的語法,第一個參數(shù)設(shè)置為:表示所有行,第二個參數(shù)設(shè)置為列號,行號和列號使用逗號分隔。實例7-10使用iloc提取列。print('列號為1的列:\n',df.iloc[:,1])print('列號為1、3的列:\n',df.iloc[:,[1,3]])print('列號3及之后的列:\n',df.iloc[:,3:])21(三)同時選擇行和列

1.使用行索引和列名

格式為:DataFrame[行索引][列名],行索引和列名的順序不限,誰在前都可以。實例7-11使用行索引和列名選擇行列。print('第一行的名稱:\n',df[0:1]['名稱'])print('行號為2、3的名稱和價格:\n',df[2:4][['名稱','價格']])222.使用loc方法

loc方法根據(jù)行索引和列名選擇行列,同時設(shè)置loc[]的兩個參數(shù)即可選中對應(yīng)的數(shù)據(jù)。實例7-12使用loc選擇行列。print('行索引為A的名稱:',df.loc['A','名稱'])print('行索引為A的名稱和價格:\n',df.loc['A',['名稱','價格']])print('A至D行、名稱至類型列:\n',df.loc['A':'D','名稱':'類型'])print('A和D行、名稱和類型列:\n',df.loc[['A','D'],['名稱','類型']])233.使用iloc方法

同時設(shè)置iloc方法的行號和列號即可訪問對應(yīng)的數(shù)據(jù)。實例7-13使用iloc選擇行列。print('行號為3、列號為2的數(shù)據(jù):',df.iloc[3,2])#即第四行、第三列的數(shù)據(jù)print('行號為3,列號為1-3的數(shù)據(jù):\n',df.iloc[3,1:4])print('行號為1和3,列號為1和4的數(shù)據(jù):\n',df.iloc[[1,3],[1,4]])注意:在提取數(shù)據(jù)的過程中,如果行、列連續(xù),使用冒號分隔,但沒有索引運算符“[]”,如果行、列不連續(xù),使用逗號分隔,同時使用索引運算符“[]”。247.2.2數(shù)據(jù)的修改

數(shù)據(jù)的修改首先要將需要修改的數(shù)據(jù)提取出來,再重新賦值為新的數(shù)據(jù)。數(shù)據(jù)的修改是針對原數(shù)據(jù)進行的,操作無法撤銷。實例7-14修改行數(shù)據(jù)。df1=df.copy()#修改最后一行數(shù)據(jù)df1[5:6]=['006','鋼筆',7,'學(xué)習(xí)用品',30]#修改行索引為E的名稱為彩筆,其他列未設(shè)置、修改結(jié)果為NaNdf1.loc['E']={'名稱':'彩筆'}df1(一)行的修改

行的修改就是先提取相關(guān)行,再直接修改行內(nèi)容。25實例7-15修改列數(shù)據(jù)。#修改行索引為A和C的價格,其他行未設(shè)置、修改結(jié)果為NaNdf1['價格']={'A':100,'C':200}#修改庫存量列數(shù)據(jù)df1['庫存量']=[10,20,25,40,65,50]df1(二)列的修改

與行的修改一致,列的修改就是提取列后修改內(nèi)容。26實例7-16修改單元格。#將第一行的“蘋果”改為“蘋果汁”df1.loc['A','名稱']='蘋果汁'#將"蘋果汁"的類型改為“飲料”df1.iloc[0,3]='飲料'df1(三)單元格的修改

單元格的修改就是先定位到單元格,再修改內(nèi)容。277.2.3數(shù)據(jù)的增加實例7-17增加行。df2=df.copy()df2.loc['G']=['007','菠蘿',18.5,'水果',20]#利用loc定位到新行G,使用列表賦值df2.loc['H']={'ID':'008','名稱':'洗衣液','價格':34.9}#使用字典為新行H賦值#定義新行new_rownew_row={'ID':'009','名稱':'保鮮袋','價格':8.9,'類型':'日用品','庫存量':30}#將new_row增加到df2中,ignore_index=True用于重置索引df2=df2._append(new_row,ignore_index=True)df2(一)行的增加

增加新行是將新的數(shù)據(jù)追加到DataFrame的末尾,實現(xiàn)的方法包括使用loc定位到新行后賦值、使用_append()方法和concat()方法等。28實例7-18增加列。df3=df.copy()#添加“進價”列,并填充數(shù)據(jù)df3['進價']=[3.5,6.8,2,5,4.5,1]#添加“利潤”列,并使用計算出的價格和進價之差填充df3['利潤']=df3['價格']-df3['進價']#添加“是否可售”列,所有的值均為邏輯Truedf3["是否可售"]=True#在列號為4的位置添加新列“上架日期”并填充數(shù)據(jù)df3.insert(4,'上架日期',['2024-5-1','2024-6-7','2024-7-10','2024-7-10','2024-7-15','2024-7-20'])df3(二)列的增加

要增加新列時,可以直接給DataFrame分配一個新的列名,并為其提供一個與DataFrame行數(shù)相匹配的序列(如列表、Series等)作為值,也可以使用insert()方法在指定位置增加新列。297.2.4數(shù)據(jù)的刪除

刪除某行或某列數(shù)據(jù)需要使用drop()方法,其基本語法為:DataFrame.drop(labels,axis=0,inplace=False)其常用參數(shù)為:drop()方法默認(rèn)返回一個新的DataFrame,包含刪除后的數(shù)據(jù)。因此,如果需要保留這個新的DataFrame,可以使用inplace=True指明在原來的DataFrame中刪除,也可以將返回的DataFrame賦值給一個新的變量。30實例7-19刪除數(shù)據(jù)。df4=df.copy()df4=df4.drop('A')#刪除行標(biāo)簽為A的行,結(jié)果返回df4df4.drop(['B','D'],axis=0,inplace=True)#在df4中刪除行標(biāo)簽為B和D的行df4=df4.drop('類型',axis=1)#刪除列名為類型的列,結(jié)果返回df4df4.drop(df4.columns[2:3],axis=1)#刪除價格到庫存量的所有列,不修改df4df4317.2.5數(shù)據(jù)的篩選

數(shù)據(jù)篩選就是從大量的數(shù)據(jù)中選出有價值的數(shù)據(jù),這樣可以提高數(shù)據(jù)的可用性,有利于后期的數(shù)據(jù)分析,同時,結(jié)合刪除、修改、增加操作,可以實現(xiàn)帶條件的數(shù)據(jù)更新。條件表達(dá)式用于篩選、?過濾數(shù)據(jù),常使用比較操作符和邏輯操作符來構(gòu)造。(一)按條件提取數(shù)據(jù)

實例7-20篩選數(shù)據(jù)。print('庫存量小于15的商品:\n',df[df['庫存量']<15])print('價格高于5的水果:\n',df[(df['價格']>5)&(df['類型']=='水果')])print('庫存量大于等于15的水果或食品:\n',df[((df['類型']=='水果')|(df['類型']=='食品'))&(df['庫存量']>=15)])print('除學(xué)習(xí)用品外的商品:\n',df[~(df['類型']=='學(xué)習(xí)用品')])print('蘋果、牛奶和辣條:\n',df[df['名稱'].isin(['蘋果','牛奶','辣條'])])(二)按條件操作數(shù)據(jù)

實例7-21按條件操作數(shù)據(jù)。df5=df.copy()#刪除食品df5=df5.drop(df5[df5['類型']=='食品'].index)#將df中價格在5-10之間的商品追加到df5中df5=df5._append(df[df['價格'].between(5,10)])#將庫存量小于10的商品價格調(diào)整為原來的2倍df5.loc[df5['庫存量']>10,'價格']=df5.loc[df5['庫存量']>10,'價格']*2df5347.3

數(shù)據(jù)的導(dǎo)入與導(dǎo)出7.3.1數(shù)據(jù)導(dǎo)入pandas庫將外部數(shù)據(jù)轉(zhuǎn)換為DataFrame數(shù)據(jù)格式,處理完成后可再存儲到外部文件中,這就是數(shù)據(jù)的導(dǎo)入和導(dǎo)出。

不同的數(shù)據(jù)源,需要使用不同的函數(shù)讀取,pandas內(nèi)置了10余種數(shù)據(jù)源讀取函數(shù)和對應(yīng)的數(shù)據(jù)寫入函數(shù)。(一)導(dǎo)入文本文件

文本文件是一種由若干字符構(gòu)成的計算機文件,是典型的順序文件。CSV是“Common—SeparatedValues”的縮寫,意思是逗號分隔值,這種文件以純文本形式存儲表格數(shù)據(jù),是一種簡單通用的文件格式。但CSV文件的分隔符不一定是逗號,所以又被稱為字符分隔文件。Pandas提供了read_table()來讀取文本文件,read_csv()來讀取CSV文件。這兩個函數(shù)的基本語法格式為:pandas.read_table(filepath,sep=’\t’,header=’infer’,names=None,encoding=’utf-8’,nrows=None)pandas.read_csv(filepath,sep=’,’,header=’infer’,names=None,encoding=’utf-8’,nrows=None)實例7-22導(dǎo)入CSV文件。importpandasaspd#使用read_table()導(dǎo)入股票數(shù)據(jù),指定分隔符和編碼方式frame1=pd.read_table('data//股票數(shù)據(jù).csv',sep=',',encoding='gbk')print(frame1.head())#使用read_csv()導(dǎo)入股票數(shù)據(jù)frame2=pd.read_csv('data//股票數(shù)據(jù).csv',encoding='gbk')print(frame2.sample(3))(二)導(dǎo)入EXCEL文件

Pandas提供了read_excel()方法來讀取Excel文件,擴展名可以是.xls或者.xlsx,其語法為:pandas.read_excel(io,sheet_name=0,header=’infer’,names=None,dtype=None)實例7-23導(dǎo)入Excel文件。#使用read_excel導(dǎo)入景區(qū).xlsx第一張工作表中的數(shù)據(jù)frame4=pd.read_excel('data//景區(qū).xlsx')frame4407.3.2數(shù)據(jù)導(dǎo)出(一)導(dǎo)出CSV文件

利用pandas中的DataFrame創(chuàng)建或編輯數(shù)據(jù)后,可以把這些數(shù)據(jù)保存到CSV文件中,這需要使用DataFrame的to_csv()方法,其基本語法為:DataFrame.to_csv(path,sep=’,’,columns=None,header=True,index=True,mode=’w’)41實例7-24輸出CSV文件。importpandasaspdimportnumpyasnp#生成一個5行4列的DataFrame,數(shù)據(jù)由numpy產(chǎn)生的0-1之間的隨機小數(shù)填充frame5=pd.DataFrame(np.random.uniform(0,1,size=(5,4)),columns=['A','B','C','D'])print(frame5)#將生成的frame5導(dǎo)出為file1.csvframe5.to_csv('data//file1.csv')42(二)導(dǎo)出EXCEL文件

要將DataFrame中的數(shù)據(jù)存儲為Excel文件,需要使用DataFrame的to_excel()方法,其基本語法為:DataFrame.to_excel(excel_writer,sheet_name=’Sheet1’,columns=None,header=True,index=True,)該方法的常用參數(shù)與to_csv()基本一致,區(qū)別在于指定excel文件存儲路徑使用excel_writer,同時增加了sheet_name參數(shù),用于指定工作表名,默認(rèn)為Sheet1。43實例7-25輸出excel文件。importpandasaspdimportnumpyasnp#生成6行5列的DataFrame,數(shù)據(jù)由numpy產(chǎn)生的1-99之間的隨機整數(shù)填充frame6=pd.DataFrame(np.random.randint(1,100,size=(6,5)),columns=list('ABCDE'))print(frame6)#將生成的frame6導(dǎo)出為file2.xlsxframe6.to_excel('data/file2.xlsx')447.4

數(shù)據(jù)的預(yù)處理

在Pandas中,數(shù)據(jù)的預(yù)處理是一個廣泛的概念,涵蓋了數(shù)據(jù)清洗、整理、合并、轉(zhuǎn)換等多個方面,用于確保數(shù)據(jù)分析中數(shù)據(jù)的質(zhì)量和可用性。本節(jié)將介紹DataFrame的標(biāo)簽修改、排序、數(shù)據(jù)合并操作以及缺失值、重復(fù)值的處理,使用的數(shù)據(jù)來自“商品銷售數(shù)據(jù).xlsx”,導(dǎo)入數(shù)據(jù)的代碼如下:importpandasaspd#從商品銷售.xlsx中導(dǎo)入商品基本信息表,指定ID列為字符串類型product=pd.read_excel('data//商品銷售.xlsx',sheet_name='商品基本信息',dtype={'ID':str})#從商品銷售.xlsx中導(dǎo)入銷售信息表,指定商品ID列為字符串類型sale=pd.read_excel('data//商品銷售.xlsx',sheet_name='銷售信息',dtype={'商品ID':str})457.4.1標(biāo)簽修改(一)使用rename()方法

作為一種二維標(biāo)簽數(shù)據(jù)結(jié)構(gòu),包括行索引(index)和列標(biāo)簽(columns)在內(nèi)的DataFrame標(biāo)簽,能夠使用多種方法進行修改。rename()方法可以用來修改行索引或列標(biāo)簽,其基本語法如下:DataFrame.rename(index=None,columns=None,inplace=False)index和columns參數(shù)分別用于定義新的行索引和列標(biāo)簽,inplace參數(shù)是個布爾值,表示是否在原始數(shù)據(jù)上進行修改,默認(rèn)為False,如果要改動原始數(shù)據(jù),應(yīng)該將inplace參數(shù)設(shè)置為True。修改列標(biāo)簽時,需要將columns參數(shù)設(shè)置為一個列表或字典,其中包含新的列名。而修改行索引時,需要將index參數(shù)設(shè)置為列表或字典,其中包含新的行索引。46實例7-26rename()方法修改標(biāo)簽。product1=product.copy()#將product1的行索引1改為“A”,2改為“B”product1.rename(index={1:'A',2:'B'},inplace=True)#臨時修改product的列名:將名稱改為商品名,類型改為類別product1.rename(columns={'名稱':'商品名','類型':'類別'})print(product1)47(二)直接設(shè)置屬性

通過修改columns屬性或index屬性來更改標(biāo)簽的方法更簡單直接,但要注意的是,需要提供一個與原始列名或行索引長度相同的列表(或類似結(jié)構(gòu)),其中包含新的列名或行索引。實例7-27通過設(shè)置屬性修改標(biāo)簽。#修改product1的index屬性,設(shè)置所有的行索引為奇數(shù)product1.index=range(1,20,2)#修改product1的columns屬性,重新設(shè)置所有的列標(biāo)簽product1.columns=['ID',"name",'price','type','quantity']product148(三)使用set_index()和reset_index()方法設(shè)置行索引

set_index()和reset_index()都可以用于設(shè)置行索引,set_index()的基本語法為:DataFrame.set_index(keys,drop=True,inplace=False)

參數(shù)中的keys用于設(shè)置將哪列作為新的index,將某列設(shè)置為行索引后,drop參數(shù)用于設(shè)置是否刪除該列,默認(rèn)為True,即刪除該列,而inplace參數(shù)則決定了是否對原數(shù)據(jù)進行修改。

reset_index()方法用于還原索引列。49實例7-28set_index()和reset_index()方法的使用。#使用set_index()方法設(shè)置name和type為行索引product1.set_index(['name','type'],inplace=True)print('設(shè)置了索引的product1:\n',product1)#將product1的兩個索引列變成普通列,重置索引product1.reset_index(inplace=True)print('重置索引的product1:\n',product1)507.4.2排序(一)sort_values()方法

基本語法為:DataFrame.sort_values(by,axis=0,ascending=True,inplace=False)

在Pandas中,對DataFrame進行排序是常見的操作,可以使用sort_values()或sort_index()方法來實現(xiàn)。sort_values()方法按值排序,而sort_index()方法按索引排序。51實例7-29sort_values()的使用。print('按價格進行升序排列:\n',product.sort_values(by='價格'))print('先按類型升序、類型相同再按價格降序排列:\n',product.sort_values(by=['類型','價格'],ascending=[True,False]))52(二)sort_index()方法

DataFrame.sort_index(axis=0,ascending=True,inplace=False)axis參數(shù)指定排序的方向,0表示按行索引,1表示按列名排序,ascending和inplace分別用于指定是否升序排列、是否修改原數(shù)據(jù)。實例7-30sort_index()的使用。print('按行索引降序排列:\n',product.sort_index(ascending=False))print('按列名升序排列:\n',product.sort_index(axis=1))537.4.3數(shù)據(jù)合并(一)concat()方法

concat()函數(shù)能沿著一條軸將多個對象堆疊到一起,可以用來合并DataFrame或Series。其基本語法為:pandas.concat(objs,axis=0,join=’outer’,ignore_index=False)Pandas允許將兩個或多個DataFrame根據(jù)一些共同的屬性(如索引、列等)合并成一個新的DataFrame,它提供了多種數(shù)據(jù)合并的方法,包括join()、concat()、merge()等。54實例7-31使用concat()方法縱向合并數(shù)據(jù)。#提取product行索引為0-2的三行p1=product.loc[0:2]#提取product行索引為8-9的兩行p2=product.loc[8:9]#臨時合并p1和p2print(pd.concat([p1,p2]))#合并p1和p2,重新索引,同時將結(jié)果保存在product2中product2=pd.concat([p1,p2],ignore_index=True)print('product2:\n',product2)55實例7-32使用concat()方法橫向合并數(shù)據(jù)。#定義new_cols,保存三個商品的供應(yīng)商和上架時間new_cols=pd.DataFrame({'供應(yīng)商':['果先生','力士','大理牧場'],'上架日期':['2024-7-1','2024-1-3','2024-7-18']})#臨時橫向合并product2和new_cols,結(jié)果為默認(rèn)的并集print(pd.concat([product2,new_cols],axis=1))#以交集、橫向方式合并product2和new_cols,結(jié)果保存在product2中product2=pd.concat([product2,new_cols],join='inner',axis=1)print(product2)56(二)merge()方法

merge是基于數(shù)據(jù)庫風(fēng)格的連接操作,用于合并兩個或多個DataFrame。它可以根據(jù)一個或多個鍵將行連接起來。該方法合并數(shù)據(jù)有4種方式,分別是內(nèi)連接、左連接、右連接和外連接。其基本語法為:pandas.merge(left,right,how=’inner’,on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=True,suffixes=(‘_x’,_y’))571.內(nèi)連接(inner)

內(nèi)連接是merge()方法的默認(rèn)連接方式,表示同時將左、右連接對象作為參考對象,根據(jù)相同的列將左表和右表連接起來,結(jié)果中包含連接鍵的交集。實例7-33內(nèi)連接1。#以product為左表、sale為右表進行內(nèi)連接,左表鍵為ID,右表鍵為商品IDpd.merge(product,sale,left_on='ID',right_on='商品ID')實例7-34內(nèi)連接2。#修改product的ID列為商品IDproduct.rename({'ID':'商品ID'},axis=1,inplace=True)#自動按相同的列進行內(nèi)連接,結(jié)果中去除了多余的同名連接列ps_inner=pd.merge(product,sale)ps_inner582.左連接(left)

左連接的結(jié)果中只包含左表的鍵,如果右表中不存在左鍵對應(yīng)的值,相應(yīng)的列就會填充為NaN。實例7-35左連接。ps_left=pd.merge(product,sale,how='left')ps_left3.右連接(right)

右連接的結(jié)果中只包含右表的鍵,如果左表中不存在右鍵對應(yīng)的值,相應(yīng)的列就會填充為NaN。。實例7-36右連接。ps_right=pd.merge(product,sale,how='right')ps_right594.外連接(outer)外連接的結(jié)果中包含左右表鍵的并集實例7-37外連接。ps_outer=pd.merge(product,sale,how='outer')ps_outer607.4.4缺失值處理(一)檢測缺失值isnull()或isna()方法都會返回一個與原DataFrame形狀相同的布爾型DataFrame,其中True表示缺失值(NaN),F(xiàn)alse表示非缺失值。(二)填充缺失值fillna()方法用于填充缺失值,可以指定一個常量值、DataFrame、Series、字典或用于計算填充值的函數(shù)作為填充值。如果指定了字典,則可以使用不同的值來填充不同的列。另外,如果要修改原數(shù)據(jù),則需要設(shè)置inplace參數(shù)為True。

在DataFrame中,缺失值通常使用NaN(NotaNumber)來表示。處理缺失值是數(shù)據(jù)清洗和預(yù)處理過程中的一個重要步驟。Pandas提供了多種方法來處理這些缺失值,包括刪除含有缺失值的行或列、填充缺失值以及檢測缺失值等。61(三)刪除缺失值dropna()方法用于刪除包含缺失值的行或列。基本語法為:DataFrame.dropna(axis=0,how=’any’,thresh=None,subset=None,inplace=False)實例7-38缺失值處理(本例使用實例7-37合并生成的ps_outer,該DataFrame包含21行數(shù)據(jù),其中有兩行包含空值,行號分別為14和21)。#修改數(shù)量列的空值為100ps_outer['數(shù)量'].fillna(100,inplace=True)print(ps_outer.loc[[14]])#刪除包含空值的行,剩余20行數(shù)據(jù)ps_outer.dropna(inplace=True)print('剩余行數(shù):',len(ps_outer))637.4.5重復(fù)值處理

在數(shù)據(jù)預(yù)處理階段,處理重復(fù)值也是一個常見的任務(wù)。利用DataFrame的duplicated()方法判斷是否有重復(fù)數(shù)據(jù),即每一行是否與之前的行完全相同。如果有重復(fù)數(shù)據(jù),則可以利用drop_duplicates()方法刪除重復(fù)的行,該方法使用inplace參數(shù)指定是否在原數(shù)據(jù)中刪除。實例7-39檢測重復(fù)值(本例使用實例7-34合并生成的ps_inner)。print(ps_inner.duplicated())實例7-40刪除重復(fù)值。ps_inner.drop_duplicates(inplace=True)ps_inner647.5

數(shù)據(jù)分組統(tǒng)計

DataFrame的分組統(tǒng)計允許用戶根據(jù)一個或多個列的值將數(shù)據(jù)分組成子集,并對每個子集執(zhí)行統(tǒng)計運算。這種操作在處理和分析具有層次結(jié)構(gòu)或分類數(shù)據(jù)時特別有用,比如銷售數(shù)據(jù)按地區(qū)和產(chǎn)品分類、客戶數(shù)據(jù)按年齡和性別分組等。657.5.1數(shù)據(jù)的描述性統(tǒng)計

可以使用DataFrame的描述性統(tǒng)計函數(shù)describe()快速了解數(shù)據(jù)的基本統(tǒng)計特征,如中心趨勢、分散程度等。describe()是獲取DataFrame描述性統(tǒng)計信息的最直接方法。

默認(rèn)情況下,describe()方法會計算數(shù)值型列的計數(shù)(count)、均值(mean)、標(biāo)準(zhǔn)差(std)、最小值(min)、四分位數(shù)(25%,50%,75%)和最大值(max)。對于非數(shù)值型列,則會計算唯一值(unique)、眾數(shù)(top)和頻數(shù)(freq)。實例7-41數(shù)據(jù)描述性統(tǒng)計。frame=ps_inner.copy()#描述性統(tǒng)計frame.describe()667.5.2常用聚合函數(shù)

聚合函數(shù)也稱多行函數(shù)或組合函數(shù),能夠?qū)σ唤M值進行計算,并返回一個值。常用聚合函數(shù)有:實例7-42聚合函數(shù)的應(yīng)用。#計算售出的總數(shù)量,即數(shù)量列的總和print('售出總量:',frame['數(shù)量'].sum())#計算價格的平均值print('商品平均價格:',frame.loc[:,'價格'].mean())#計算庫存量的最大值print('最大庫存量:',frame.iloc[:,4].max())#計算記錄數(shù)print('記錄數(shù)量:',frame['商品ID'].count())#計算該DataFrame中的商品數(shù)量,即不重復(fù)的商品IDprint('商品數(shù)量:',frame['商品ID'].nunique())#查詢單次售出最多的記錄,即數(shù)量等于數(shù)量最大值的商品print('單次售出最多的記錄:\n',frame[frame['數(shù)量']==frame['數(shù)量'].max()])#查詢價格高于商品平均價格的日用品售出記錄print(frame[(frame['類型']=='日用品')&(frame['價格']>frame['價格'].mean())])687.5.3數(shù)據(jù)的分組聚合

數(shù)據(jù)分組聚合的核心方法是先進行分組,然后對每個分組應(yīng)用聚合函數(shù),基本步驟包括:1.確定組依據(jù):首先,需要確定根據(jù)哪些列的值來分組。這些列將作為分組的“鍵”,決定了數(shù)據(jù)如何被劃分成不同的子集。2.確定聚合函數(shù):一旦數(shù)據(jù)被分組,就可以對每個分組應(yīng)用聚合函數(shù)來計算統(tǒng)計量。這些聚合函數(shù)可以是7.5.2中介紹的內(nèi)置聚合函數(shù),如sum()、mean()、min()、max()、count()等,也可以是自定義的函數(shù)。3.執(zhí)行分組統(tǒng)計:使用groupby()方法選擇分組依據(jù),并通過鏈?zhǔn)讲僮髡{(diào)用聚合函數(shù)來執(zhí)行分組統(tǒng)計。69(一)groupby()分組函數(shù)

在pandas中,數(shù)據(jù)分組使用groupby()函數(shù),它能根據(jù)一個或多個鍵將DataFrame分成不同的組。分組的過程就是將原有的DataFrame按照鍵的值,劃分為若干個分組DataFrame,被分為多少個組就有多少個子DataFrame。因此,groupby()函數(shù)得到一個GroupBy對象,并沒有進行實際運算,只是包含了分組后的中間數(shù)據(jù)。groupby()的基本語法為:DataFrame.groupby(by=None,axis=0,level=None,as_index=True,sort=True,group_keys=True,dropna=True)實例7-43數(shù)據(jù)分組。#按類型分組,查看分組情況gs1=frame.groupby('類型')print('類型分組:\n',gs1.groups)#先按銷售日期分組,再按類型分組,查看分組情況gs2=frame.groupby(['銷售日期','類型'])print('按銷售日期和類型分組:\n',gs2.groups)雖然groupby()本身不是一個聚合函數(shù),但它與聚合函數(shù)結(jié)合使用時非常強大,可以在groupby()返回的分組調(diào)用聚合函數(shù)。實例7-44所有列的分組聚合。#對gs1分組結(jié)果應(yīng)用count()gs1.count()如果統(tǒng)計只針對部分列進行,可以在命令中選擇相關(guān)列進行操作,選擇多列統(tǒng)計時,列名應(yīng)該放在列表中。實例7-45分組聚合應(yīng)用。#查詢各類商品的最低價格,即按類型分組,對價格進行求最小值運算print('各類商品的最低價格:\n',frame['價格'].groupby(frame['類型']).min())print('-'*50)#查詢每天的銷售額,即按銷售日期分組,對小計(新增列:價格*數(shù)量)進行求和運算frame['小計']=frame['價格']*frame['數(shù)量']print('每天的銷售額:\n',frame.groupby('銷售日期')[['小計']].sum())print('-'*50)#查詢每天每類商品的最高銷售額,即按銷售日期和類型分組,對小計和數(shù)量求最大值print('每天各類商品的最高銷售額:\n',frame.groupby(['銷售日期','類型'])[['小計','數(shù)量']].max())print('-'*50)#查詢最暢銷的兩種商品,即按名稱分組,求出數(shù)量的和后降序排列,再顯示前兩項print('最暢銷的兩種商品:\n',frame['數(shù)量'].groupby(frame['名稱']).sum().sort_values(ascending=False).head(2))print('-'*50)#計算每類商品售出的次數(shù),即按類型分組,對類型列進行計數(shù)運算print('每類商品的售出次數(shù):\n',frame[['類型']].groupby(frame['類型']).count().rename({'類型':'售出次數(shù)'},axis=1))73(二)agg()函數(shù)

之前的實例中,雖然在分組對象上定義了很多方便的函數(shù),但無法同時使用多個函數(shù),無法在特定的列上使用特定的函數(shù),也無法使用自定義的聚合函數(shù),使用agg()函數(shù)可以輕松解決以上的問題。實例7-46agg()函數(shù)的使用。#對同一列同時使用多個聚合函數(shù),將函數(shù)放入列表傳入agg函數(shù)#查詢每天的銷售額的和、平均值、最小值、最大值,保留兩位小數(shù)print(frame.groupby('銷售日期')[['小計']].agg(['sum','mean','max','min']).round(2))print('-'*50)#對不同的列使用不同的聚合函數(shù),通過構(gòu)造字典定義列與聚合函數(shù)的對應(yīng)關(guān)系#查詢每天銷售額的和,每天銷售數(shù)量的和以及最大值print(frame.groupby('銷售日期')[['小計','數(shù)量']].agg({'小計':'sum','數(shù)量':['sum','max']}))print('-'*50)

#自定義函數(shù)myfunc,返回最大值與最小值之差defmyfunc(x):returnx.max()-x.min()#查詢每類商品的最高價格與最低價格之差print(frame.groupby('類型')['價格'].agg(myfunc))747.6

創(chuàng)建透視表和交叉表

在Pandas中,透視表(pivottable)和交叉表(crosstab)都是用于數(shù)據(jù)匯總、重組和分析的強大工具。7.6.1創(chuàng)建透視表

透視表可以根據(jù)一個或多個鍵對數(shù)據(jù)進行分組,并對分組后的數(shù)據(jù)進行聚合計算。

透視表可以通過pandas的pivot_table函數(shù)來創(chuàng)建,其基本語法為:pandas.pivot_table(data,values=None,index=None,columns=None,aggfunc='mean',fill_value=None,margins=False,dropna=True,margins_name=’All’)75實例7-47創(chuàng)建透視表統(tǒng)計每天各種產(chǎn)品的銷售額。#行上使用銷售日期分組,列上使用產(chǎn)品名稱分組,對小計進行求和運算pt1=pd.pivot_table(frame,values='小計',index='銷售日期',columns='名稱',aggfunc='sum')pt1實例7-48創(chuàng)建透視表統(tǒng)計統(tǒng)計每天各類產(chǎn)品的銷售額,銷售數(shù)量的最大值。#行上使用銷售日期分組,列上使用類型分組,對小計進行求和運算、對數(shù)量求最大值pt2=pd.pivot_table(frame,values=['小計','數(shù)量'],index='銷售日期',columns='類型',aggfunc={'小計':'sum','數(shù)量':'max'})pt2777.6.2創(chuàng)建交叉表

交叉表主要用于計算兩個(或多個)變量的頻率表,也就是一個列聯(lián)表(contingencytable)。crosstab函數(shù)是Pandas庫中的一個便捷函數(shù),用于創(chuàng)建交叉表。其基本語法為:pandas.crosstab(index,columns,values=None,aggfunc='count',margins=False,margins_name=’All’)78實例7-49創(chuàng)建交叉表。#統(tǒng)計每天每類商品的售出次數(shù)#以銷售日期為行分組索引,類型為列分組索引,顯示出總計,并改名為總計次數(shù)ct=pd.crosstab(frame['銷售日期'],frame['類型'],margins=True,margins_name='總計次數(shù)')ct79

透視表(pivot_table)和交叉表(crosstab)在某些方面功能相似,但在使用場景和靈活性上有所不同,具體表現(xiàn)為:1.靈活性。透視表比交叉表更加靈活,因為它允許指定多個行索引和列索引,并且可以進行復(fù)雜的聚合計算。2.用途。交叉表更適合于簡單的分類數(shù)據(jù)匯總,尤其是想要快速生成一個列聯(lián)表時。而透視表則更適用于需要復(fù)雜數(shù)據(jù)重組和聚合計算的場景。3.默認(rèn)行為。如果不指定values和aggfunc,交叉表默認(rèn)計算頻數(shù),而透視表會報錯,因為它需要知道要聚合的列和聚合函數(shù)。

因此在選擇使用哪個函數(shù)時,應(yīng)該根據(jù)具體需求和數(shù)據(jù)的特點來決定。80思維導(dǎo)圖81Python數(shù)據(jù)分析及應(yīng)用第8章

時間序列分析

目錄

8.1時間獲取8.2時間的格式化8.3時間列的基本操作8.4時間索引(1)知識目標(biāo):認(rèn)識Python中時間的常用表示方法,掌握不同表示方法之間的相互轉(zhuǎn)換,掌握不同時間單位的時間的獲取方法,理解時間在數(shù)據(jù)分析中的重要性。(2)技能目標(biāo):理解在數(shù)據(jù)分析中時間作為分析對象和分析依據(jù)的不同,掌握時間在數(shù)據(jù)分析中的應(yīng)用,認(rèn)識到時間序列分析的價值。(3)素質(zhì)目標(biāo):培養(yǎng)分析問題并合理解決問題的能力,培養(yǎng)調(diào)試程序并修改程序的能力,培養(yǎng)軟件安全和數(shù)據(jù)安全的意識,培養(yǎng)優(yōu)化代碼以提高代碼質(zhì)量和安全性的意識。83學(xué)習(xí)目標(biāo)時間序列分析的價值時間在各種數(shù)據(jù)分析中是一種重要的分析對象和分析依據(jù)。時間序列數(shù)據(jù)是一系列隨時間間隔收集的數(shù)據(jù),記錄了一個或多個變量隨時間的變化趨勢,如股票價格、人口數(shù)量、氣溫、交通流量、銷售額等。隨著大數(shù)據(jù)、物聯(lián)網(wǎng)、人工智能等新興技術(shù)的興起,時間序列數(shù)據(jù)廣泛存在于各個領(lǐng)域,如工業(yè)控制、農(nóng)業(yè)、股票市場、氣象、經(jīng)濟、人口統(tǒng)計、電子商務(wù)、網(wǎng)絡(luò)流量、物聯(lián)網(wǎng)、外匯交易等。時間序列數(shù)據(jù)典型特點是產(chǎn)生頻率快、嚴(yán)重依賴于采集時間。時間序列分析是一種分析時間序列數(shù)據(jù)的特定方法。時間序列分析的目標(biāo)是找出時間序列數(shù)據(jù)中的模式、趨勢和季節(jié)性,以及進行未來趨勢預(yù)測、異常檢測、決策制定等。無論是哪種應(yīng)用環(huán)境中的時間序列數(shù)據(jù),都可以通過對它的分析做出更明智的決策。但是,在Python程序中應(yīng)如何對時間序列數(shù)據(jù)進行處理和分析呢?84本章導(dǎo)讀1、datetime庫2、獲取當(dāng)前時間3、獲取特定時間4、時間的計算858.1時間獲取1、datetime庫datetime庫以類的方式提供多種日期和時間表達(dá)方式。868.1時間獲取類名描述datetime.date日期表示類,可以表示年、月、日等datetime.time時間表示類,可以表示小時、分鐘、秒、毫秒等datetime.datetime日期和時間表示的類,功能覆蓋date和time類datetime.timedelta與時間間隔有關(guān)的類,可以表示兩個日期或時間之間的時間間隔datetime.tzinfo與時區(qū)有關(guān)的信息的表示類datetime類提供了多種方法和屬性,以便對日期和時間進行各種操作,如時間獲取、時間格式化、計算日期和時間差等。2、獲取當(dāng)前時間當(dāng)前時間:是指當(dāng)前運行代碼的計算機系統(tǒng)的時間。使用datetime庫datetime類的now()方法獲取當(dāng)前時間。878.1時間獲取實例8.1獲取當(dāng)前時間方法一:fromdatetimeimportdatetime#導(dǎo)入datetime庫的datetime類print(datetime.now())方法二:importdatetime#導(dǎo)入datetime庫print(datetime.datetime.now())程序運行結(jié)果:2024-07-1720:21:29.4009033、獲取特定時間信息指獲得特定的時間單位信息。888.1時間獲取實例8.2分別獲取當(dāng)前時間的年、月、時、分信息。fromdatetimeimportdatetimeprint(datetime.now())#獲取當(dāng)前時間并輸出print(datetime.now().year)#獲取當(dāng)前時間的年份并輸出print(datetime.now().month)#獲取當(dāng)前時間的月份并輸出print(datetime.now().hour)#獲取當(dāng)前時間的小時并輸出print(datetime.now().minute)#獲取當(dāng)前時間的分鐘并輸出程序運行結(jié)果:2024-07-1720:21:29.4009032024720213、獲取特定時間信息使用datetime類型對象的date()和time()方法分別得到特定時間的日期和時間值。898.1時間獲取實例8-3分別得到當(dāng)前時間的日期和時間值實例8-3分別得到當(dāng)前時間的日期和時間值。fromdatetimeimportdatetimenow=datetime.now()#獲取當(dāng)前時間,為datetime類型的對象print(now)print(now.date())#獲得該對象的日期并輸出print(now.time())#獲得該對象的時間并輸出程序運行結(jié)果:程序運行結(jié)果:2024-07-1720:21:29.4009032024-07-1720:21:29.4009033、獲取特定時間信息使用datetime類的datetime()函數(shù),可以通過指定特定的年、月、日、時、分、秒等時間單位的值,生成一個特定的datetime類型的時間。908.1時間獲取實例8.3分別得到當(dāng)前時間的日期和時間值fromdatetimeimportdatetimenow=datetime.now()#獲取當(dāng)前時間,為datetime類型的對象print(now)print(now.date())#獲得該對象的日期并輸出print(now.time())#獲得該對象的時間并輸出程序運行結(jié)果:2024-07-1720:21:29.4009032024-07-1720:21:29.4009033、獲取特定時間信息使用datetime類的datetime()函數(shù),可以通過指定特定的年、月、日、時、分、秒等時間單位的值,生成一個特定的datetime類型的時間。918.1時間獲取使用方法:datetime(year,month,day,hour=0,minute=0,second=0,microsecond=0)year:指定的年份,四位數(shù)。取值范圍是1-9999之間的整數(shù)。例如:2021。month:指定的月份,1-12之間的整數(shù)。day:指定的日,1-31之間的整數(shù)。hour:指定的小時,0-23之間的整數(shù)。minute:指定的分鐘數(shù),0-59之間的整數(shù)。second:指定的秒數(shù),0-59之間的整數(shù)。microsecond:指定的微秒,0-999999之間的整數(shù)。正常使用此函數(shù)需要至少三個參數(shù)值。3、獲取特定時間信息datetime.datetime()928.1時間獲取實例8.4獲取特定時間fromdatetimeimportdatetimeprint(datetime(2024,1,1,9,30,0))程序運行結(jié)果:2024-01-0109:30:004、時間的計算時間的計算包括計算某個時間之前或之后的某個時間,計算兩個時間之間的間隔,比較日期的大小等。方法是將datetime類和timedelta類結(jié)合來處理時間間隔的問題。使用timedelta類可以輕松地對日期進行加減操作,實現(xiàn)日期的前后推移。938.1時間獲取timedelta類表示一段時間,而不是一個時刻。運算描述someday2=someday1+tdelta如果tdelta.days>0,則在時間線上前進;如果tdelta.days<0,則在時間線上后退。someday2=someday1-tdelta如果tdelta.days>0,則在時間線上后退;如果tdelta.days<0,則在時間線上前進。tdelta=someday1-someday2計算兩個時間的間隔。兩個時間均為同種類型的對象,否則將會引發(fā)TypeError。someday1==someday2判斷兩個時間是否相等。someday1!=someday2判讀兩個時間是否不相等。someday1<someday2進行兩個時間大小的比較,判斷日期的先后順序。someday1>someday2someday1<=someday2someday>=someday2someday1和someday2是datetime類型的對象,表示某一特定的時間;tdelta是timedelta類型的對象,表示一個時間間隔。4、時間的計算timedelta()函數(shù)可以創(chuàng)建timedelta對象。948.1時間獲取使用方法如下:timedelta(days=0,seconds=0,microseconds=0,milliseconds=0,minutes=0,hours=0,weeks=0)返回一個timedelta對象,表示兩個時間之間的差異。實例8-5獲取當(dāng)前時間和前一天的時間fromdatetimeimportdatetimefromdatetimeimporttimedelta#導(dǎo)入datetime庫的timedelta類now=datetime.now()print(now)yesterday=now+timedelta(days=-1)#與當(dāng)前時間間隔為-1天,即計算前一天的時間print(yesterday)程序運行結(jié)果:2024-07-1720:21:29.4009032024-07-1620:21:29.4009034、時間的計算958.1時間獲取實例8-6計算兩個時間的間隔fromdatetimeimportda

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論