【DS with Python】DataFrame的合并、分組聚合與數(shù)據(jù)透視表
本節(jié)主要介紹數(shù)據(jù)處理過程中Pandas的常見模塊與DataFrame的常見處理方法,建議參數(shù)問題可以查查在API reference中有各個功能的詳細參數(shù)與具體介紹
一、DataFrame的合并
1.1 按列名合并 (pd.merge())
如果需要將兩個DataFrame合并,我們可以用pandas中的merge功能
pd.merge(df1,df2,how='inner',on=None,left_index=False,right_index=False,left_on=None,right_on=None,suffixes=('_x', '_y'))
-
常用的參數(shù): df1和df2是兩個DataFrame,how是連接方式,on是按哪一列進行合并,也可以傳入一個list,用Multi-index來合并,如果需要合并的列在兩張表名字不同,可以用left_on和right_on參數(shù),如果想用index來合并,可以選擇left_index=True或者right_index=True。如果兩張表中的列名是一樣的,新表中來自df1的列名會自動在最后添加'_x',來自df2的列名會自動在最后添加'_y',可以在suffixes中修改。 -
如何合并?假設(shè)我們有兩個DataFrame,分別是學生students和職工staff,那我們有幾種合并方式?
??假設(shè)我們以Students為df1,staff為df2 ??(注意:此處P2包含了Student的數(shù)據(jù)和Staff的數(shù)據(jù),直白來說P1+P2不等于Student) ??1.只要交集部分P2,可以用內(nèi)連接,how='inner'??2.要整個圖形P1+P2+P3, 可以用外連接,how='outer'??3.只要包含所有學生部分P1+P2,可以用左連接,how='left'??4.只要包含所有職工部分P2+P3,可以用右連接,how='right'
例如,在學校中有的人既是老師,有是職工,我們想要得到所有的人員名單,可以用outer模式來合并,空值會用NaN代替:
import pandas as pd
import numpy as np
staff_df=pd.DataFrame([{<!-- -->'Name':'Kelly','Role':'Director of HR'},
{<!-- -->'Name':'Mike','Role':'Course Liasion'},
{<!-- -->'Name':'Sally','Role':'Grader'},])
staff_df=staff_df.set_index('Name')
student_df = pd.DataFrame([{<!-- -->'Name':'James','School':'Business'},
{<!-- -->'Name':'Mike','School':'Law'},
{<!-- -->'Name':'Sally','School':'Engineering'}])
student_df=student_df.set_index('Name')
df1=pd.merge(staff_df,student_df,how='outer',left_index=True,right_index=True)
df1
??如果我們想要查看所有學生,并看看他們是否有教職,那就把student_df看作df1并用inner連接
df1=pd.merge(staff_df,student_df,how='inner',left_index=True,right_index=True)
df1
??如果學生有姓和名,可以用list來做on的參數(shù)連接
staff_df = pd.DataFrame([{<!-- -->'First Name': 'Kelly', 'Last Name': 'Desjardins',
'Role': 'Director of HR'},
{<!-- -->'First Name': 'Sally', 'Last Name': 'Brooks',
'Role': 'Course liasion'},
{<!-- -->'First Name': 'James', 'Last Name': 'Wilde',
'Role': 'Grader'}])
student_df = pd.DataFrame([{<!-- -->'First Name': 'James', 'Last Name': 'Hammond',
'School': 'Business'},
{<!-- -->'First Name': 'Mike', 'Last Name': 'Smith',
'School': 'Law'},
{<!-- -->'First Name': 'Sally', 'Last Name': 'Brooks',
'School': 'Engineering'}])
pd.merge(staff_df, student_df, how='inner', on=['First Name','Last Name'])
??如果有兩列的名字是相同的,df1的列名會添加_x,df2則添加_y,當然也可以在suffixes參數(shù)中調(diào)整例如suffixes=('_a','_b')
staff_df = pd.DataFrame([{<!-- -->'Name': 'Kelly', 'Role': 'Director of HR',
'Location': 'State Street'},
{<!-- -->'Name': 'Sally', 'Role': 'Course liasion',
'Location': 'Washington Avenue'},
{<!-- -->'Name': 'James', 'Role': 'Grader',
'Location': 'Washington Avenue'}])
student_df = pd.DataFrame([{<!-- -->'Name': 'James', 'School': 'Business',
'Location': '1024 Billiard Avenue'},
{<!-- -->'Name': 'Mike', 'School': 'Law',
'Location': 'Fraternity House #22'},
{<!-- -->'Name': 'Sally', 'School': 'Engineering',
'Location': '512 Wilson Crescent'}])
pd.merge(staff_df, student_df, how='left', on='Name',suffixes=('_a','_b'))
1.2 相同列添加行數(shù) (pd.concat()功能)
例如,我們將同一個指標的2011年、2012年和2013年的數(shù)據(jù)合并到一張表中,可以用pd.concat()功能,如下:
frames = [df_2011, df_2012, df_2013]
df=pd.concat(frames)
print(len(df_2011)+len(df_2012)+len(df_2013))
df

二、應(yīng)用 (.apply()功能)
DataFrame和Series都可以應(yīng)用.apply()功能,語法為:df.apply() Series.apply() ,在apply中的參數(shù)主要是函數(shù),可以是def定義函數(shù),也可以是lambda函數(shù)。為了用好apply()功能,需要了解以下問題:
-
apply()傳入?yún)?shù)到底是什么?對于Series使用apply()功能是將Series中的每一個元素作為傳入?yún)?shù)放入apply中的函數(shù)中,返回單值。??而對DataFrame使用apply()功能,是將DataFrame中的每一個Series作為傳入?yún)?shù)放入apply中的函數(shù)中,返回Series。
注意:前面我們講到,DataFrame中的row和columns實際上只是名字不同而已,在DataFrame中的格式和地位都是一樣的,所以DataFrame可以傳入每一行的Series(對列進行apply,利用apply()功能中的參數(shù)axis=1)也可以傳入每一列的Series(對行進行apply,利用axis=0,這個是默認值,即如果不加axis參數(shù),apply()功能會將按列傳入Series),用兩個例子來說明:
import pandas as pd
import numpy as np
dic={<!-- -->'a':[5,6,7],'b':[6,7,8],'c':[8,9,0]}
df=pd.DataFrame(dic)
print(df)
f = lambda x: x.max() + x.min()
def show_series(row):
print(row)
print(df.apply(f,axis=1))
print(df.apply(f,axis=0))
df.apply(show_series)
-
apply與dict我們知道python的def設(shè)計函數(shù)的時候可以設(shè)定默認參數(shù),參數(shù)中有args=()和**kwarge,前者表示可以傳入tuple,后者表示可以傳入dict,那么我們在設(shè)計的時候,利用這一特性,傳入字典,這可以幫我們進一步了解apply()的使用,例如我們要設(shè)置少數(shù)民族加分政策,漢族加0分,回族加10分,藏族加5分(不代表現(xiàn)實生活中真實數(shù)據(jù)):
data=[{<!-- -->'Name':'張','Nationality':'漢','Score':400},
{<!-- -->'Name':'李','Nationality':'回','Score':450},
{<!-- -->'Name':'王','Nationality':'漢','Score':460}]
df=pd.DataFrame(data)
def add_extra2(nationality,**kwargs):
return kwargs[nationality]
df['extra']=df.Nationality.apply(add_extra2,漢=0,回=10,藏=5)
df
??在這里,我們給a的屬性是一個dict,對于DataFrame的Nationality列進行apply,傳入的就是每一個Nationality的元素,查詢字典kwargs中對應(yīng)的值并返回一個單值,傳給df[‘extra’]。
三、分組 (.groupby())
3.1 groupby的原理與返回值
Pandas模塊中.groupby() 功能背后的思想是,它獲取一些DataFrame,根據(jù)一些鍵值將其拆分(split)為塊,對這些塊應(yīng)用(apply)計算,然后將結(jié)果合并(combine)回另一個DataFrame。在pandas中,這稱為“split-apply-combine”模式,其語法為:
df.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False, **kwargs)
.groupby()返回的是一個tuple,其中第一個值是用于分類的key值,通常記作group,第二個值是當前key值所對應(yīng)的DataFrame,通常記作frame。本質(zhì)上.group()和迭代器計算是很像的,例如以下兩段代碼,所實現(xiàn)的功能是一樣的,但是.groupby()在計算效率上比普通的迭代器要快上不少:
%%timeit -n 3
for group, frame in df.groupby('STNAME'):
avg = np.average(frame['CENSUS2010POP'])
# And print the results
print('Counties in state ' + group +
' have an average population of ' + str(avg))
%%timeit -n 3
for state in df['STNAME'].unique():
avg = np.average(df.where(df['STNAME']==state).dropna()['CENSUS2010POP'])
print('Counties in state ' + state +
' have an average population of ' + str(avg))
接下來通過介紹主要分組依據(jù)用到的參數(shù)by,就可以對groupby()有良好的理解
-
在by中設(shè)定規(guī)則,你可以傳入列名,函數(shù),list,dict或者Series首先,最常規(guī)的就是像上面的例子中用DataFrame的列名。
第二是用函數(shù),要注意,在調(diào)用函數(shù)的時候,傳入函數(shù)中的數(shù)據(jù)是DataFrame的index,所以要確保之前已經(jīng)用set_index()功能實現(xiàn)了對index的設(shè)置,例如,我們要根據(jù)美國的某個州的第一個字母來分組,如果第一個字母為[A-L]則返回0,為[M-P]返回1,其他則返回2:
df = df.set_index('STNAME')
def set_batch_number(item):
if item[0]<'M':
return 0
if item[0]<'Q':
return 1
return 2
for group, frame in df.groupby(set_batch_number):
print('There are ' + str(len(frame)) + ' records in group ' + str(group) + ' for processing.')
??第三是用list,這用于多重分類的時候,比如我們要按某商品的‘cancellation_policy’和‘review_scores_value’進行分類,可以用如下方法查看分類的依據(jù):
df=pd.read_csv("datasets/listings.csv")
dicts=["cancellation_policy","review_scores_value"]
for group, frame in df.groupby(dicts):
print(group)
??如果DataFrame是有多重index的,我們可以直接用多重index進行分組,這時需要添加level參數(shù),level參數(shù)用于確認index在groupby中的先后順序
import pandas as pd
df=pd.read_csv("datasets/listings.csv")
df=df.set_index(["cancellation_policy","review_scores_value"])
for group, frame in df.groupby(level=(0,1)):
print(group)
??第四,用Series或者Dict,他和list是很像的,但這往往是對列進行分組,即需要添加axis=1,分組時key值是按分組分組,在分組后會將組名改為key值對應(yīng)的value值
df=pd.read_csv("datasets/listings.csv")
dicts={<!-- -->"cancellation_policy":1,"review_scores_value":2}
for group, frame in df.groupby(dicts,axis=1):
print(group,frame)
3.2 分組后數(shù)據(jù)聚合 (.agg())
agg的語法為:df.groupby()['列名'].agg({'列名':(函數(shù),函數(shù))}) ??或者 df.groupby()['列名'].agg([函數(shù),函數(shù)]) ??注:列名可以緊跟在groupby()后,也可以在agg()內(nèi)用dict來表示
在將DataFrame分組后,我們可以對分組后的值進行計算,主要包括以下幾種:
|函數(shù)|作用 |------ |np.min|求最小值 |np.max|求最大值 |np.sum|求和 |np.mean|求評價值 |np.meadian|求中值 |np.std|求標準差 |np.var|求方差 |np.size|分組大小
(當然,忽略np.,直接用mean或者min也是可以的,想要用np.nanmean或者np.nanmax也是可以的)
(注意求平均值不能用np.average,因為他不會忽略NaN值,所以如果數(shù)據(jù)中有NaN,那么np.average就會給你返回NaN)
例如,我們要求某商品按’cancellation_policy’分類后,計算’review_scores_value’的平均值和方差,并計算’reviews_per_month’的平均值,我們可以用agg函數(shù):
df.groupby('cancellation_policy').agg({<!-- -->'review_scores_value':(np.nanmean,np.nanstd),
'reviews_per_month':np.nanmean})
??這里我們就能看到多重標簽了,在下文會介紹stack()和unstack()來展開、壓縮或轉(zhuǎn)換這些多重標簽。
3.3 分組后數(shù)據(jù)轉(zhuǎn)換 (.transform())
我們經(jīng)過對聚合函數(shù)agg的練習發(fā)現(xiàn),他對分組進行運算后得到一個單一的值(平均數(shù)、最小數(shù)、中位數(shù)等等)但如果我們要將這個數(shù)應(yīng)用到同一組的所有值上面呢?
第一種方法是用map函數(shù),是可以的,但是我們可以一步到位,就是第二種方法,不用.agg()而用.transform(),他與.agg()最大的區(qū)別在于:
-
agg()每個組只返回一個值。- tranform()返回與組大小相同的對象。舉一個例子,我們將商品按’cancellation_policy’分類后,要查看’review_scores_value’的平均值,如果用agg()會得到以下結(jié)果,四個組,一個組對應(yīng)一個值:
cols=['cancellation_policy','review_scores_value']
transform_df=df[cols].groupby('cancellation_policy').agg(np.nanmean)
transform_df
但如果用.transform(),那么所有條數(shù)的數(shù)據(jù)的對應(yīng)的平均值就都出來了:
cols=['cancellation_policy','review_scores_value']
df['mean_value']=df[cols].groupby('cancellation_policy').transform(np.nanmean)
df[['cancellation_policy','review_scores_value','mean_value']]
3.4 分組后數(shù)據(jù)過濾 (.filter())
如果想刪掉某些數(shù)據(jù),用.filter()就可以了,比如我們要把所有平均值>9.2的數(shù)據(jù)篩選,用lambda函數(shù)和filter就可以了,比如我們看到按strict分組后的平均值9.08,那我們看看篩選完后是否還能查到:
df.groupby('cancellation_policy').filter(lambda x:np.nanmean(x['review_scores_value'])>9.2)
df[df['cancellation_policy']=='strict']
3.5 分組后應(yīng)用 (.apply())
.apply()函數(shù)功能也可以用在分組的結(jié)果后,與第二章用法一致,要注意,在apply()中調(diào)用函數(shù)時,傳入的參數(shù)是.groupby()中返回的frame。
例如,我們想查看按’cancellation_policy’分組后’review_scores_value’與平均值的差,可以寫一個calc_mean_review_scores()的函數(shù)來實現(xiàn):
df=pd.read_csv("datasets/listings.csv")
df=df[['cancellation_policy','review_scores_value']]
def calc_mean_review_scores(group):
#print(group)##傳入的是.groupby()后的frame
avg=np.nanmean(group['review_scores_value'])
group['review_scores_value']=np.abs(avg-group['review_scores_value'])
return group
df.groupby('cancellation_policy').apply(calc_mean_review_scores).head()
四、數(shù)據(jù)尺度 (Data Scales)
4.1 四種尺度
在統(tǒng)計學中,主要有四種尺度:
-
Ratio Scale 等比尺度 可以用等比尺度來測量的變量,屬性:任意位置的單位距是相等的;數(shù)學運算的+ - * / 都是有效的;沒有真0值,0表示測量值不存在,例如:身高、體重。1. Interval Scale 等距尺度 數(shù)值之間的單位間隔是等距的一種尺度,存在真0值,例如:年份、溫度。1. Ordinal Scale 次序尺度 根據(jù)事物的特征對其進行等級排序的一種尺度,屬性:每一個數(shù)據(jù)有特殊含義;有從小到大的順序,但是間距未必是均勻的。例如:考試等級、用戶評價。1. Nominal Scale (or Categorical Data) 名目尺度 根據(jù)事物的特征對其進行分類。不具有等級排序。例如,隊伍的名稱、性別。前兩種是連續(xù)的,而后兩種是離散的。
在DataFrame中默認的是名目尺度,查看DataFrame的type,即dtype往往發(fā)現(xiàn)是’object’類型:
import pandas as pd
df=pd.DataFrame(['A+', 'A', 'A-', 'B+', 'B', 'B-', 'C+', 'C', 'C-', 'D+', 'D'],
index=['excellent', 'excellent', 'excellent', 'good', 'good', 'good',
'ok', 'ok', 'ok', 'poor', 'poor'],
columns=['Grades'])
df.dtypes
--Outputs:
Grades object
dtype: object
如果我們想把Categorical Data改成Ordinal Data,我們可以用.astype('category'),但此時,我們是沒有定義順序的,要給定順序,需要調(diào)用pd.CategoricalDtype來實現(xiàn),如下所示
df['Grades'].astype('category')
my_categories=pd.CategoricalDtype(categories=['D', 'D+', 'C-', 'C', 'C+', 'B-', 'B', 'B+', 'A-', 'A', 'A+'],
ordered=True)
grades=df['Grades'].astype(my_categories)
??我們要查看比C大的類型可以直接用grades[grades>'C']來實現(xiàn):
4.2 轉(zhuǎn)化等距/等比尺度為次序尺度 (pd.cut())
事實上,我們常常把等距或等比尺度上的事物,進行等級化,形成次序尺度。這聽起來很費解,舉個例子來說,在研究某個事情的頻率或者其分布區(qū)間的時候,我們在數(shù)據(jù)可視化時會考慮利用到直方圖來實現(xiàn),這是實際上就是對原本的等距或等比的數(shù)據(jù)進行了重新的分類。這種分類會降低數(shù)據(jù)的維度,但降維后的數(shù)據(jù)會有其額外應(yīng)用價值(比如用于機器學習中的標簽分類)
Pandas中我們用到pd.cut()來實現(xiàn)對數(shù)據(jù)的等距分割,例如我們要計算美國每個州2010年的各個城市的平均人口統(tǒng)計數(shù)據(jù)
import numpy as np
import pandas as pd
df=pd.read_csv("datasets/census.csv")
#reduce data
df=df[df['SUMLEV']==50]
df=df.set_index('STNAME').groupby(level=0)['CENSUS2010POP'].agg(np.average)
df.head()
??接下來用pd.cut(df,10),我們就可以得到10個等距的范圍,并看到各個州分別在哪個范圍之內(nèi):
五、數(shù)據(jù)透視表(Pivot Table)
5.1 數(shù)據(jù)透視表的理論
Pandas中的數(shù)據(jù)透視表是處于特定目的對數(shù)據(jù)進行匯總,并用DataFrame格式表現(xiàn)的一種方法。他高度依賴聚合函數(shù)。??數(shù)據(jù)透視表本身也是一個DataFrame,他的行代表一個你感興趣的變量,列代表另一個你感興趣的變量,中間的每一個格子上是某個聚合函數(shù)的數(shù)值。有的數(shù)據(jù)透視表還會包含邊界值(merginal value),可能是每一行或者每一列的和,讓你能夠快速的查看兩個變量之間的關(guān)系。
5.2 創(chuàng)建數(shù)據(jù)透視表(.pivot_table())
在創(chuàng)建數(shù)據(jù)透視表的時候,我們需要明確兩個變量一個值和至少一個聚合函數(shù):
-
索引變量1. 列變量1. 待聚合的值1. 聚合函數(shù) pandas會根據(jù)兩個變量按索引變量進行分組,對待聚合的值進行聚合函數(shù),并將輸出值放在將每一個格子中,語法如下(也可以用 pd.pivot_table(DataFrame,...)的形式創(chuàng)建):
df.pivot_table(values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False, sort=True)
這里常用的幾個參數(shù):value就是待聚合的值,index就是索引變量(可以雙重變量),columns就是列變量(可以雙重變量),aggfunc是可以給list用以一次性進行多種聚合操作,如果列變量選了雙重變量,也可以給dict,即margins表示邊界值,默認是FALSE,名字默認為’ALL’可以在margins_name修改。
例如,我們要對不同國家(索引變量) 不同等級的高校(列變量)(分一等、二等、三等和其他)根據(jù)總得分的評分值和最大值(待聚合值)繪制數(shù)據(jù)透視表,并給出邊界值:
df.pivot_table(values='score', index='country', columns='Rank_Level', aggfunc=[np.mean, np.max], margins=True).head()
5.3 查詢數(shù)據(jù)透視表
在這里我們發(fā)現(xiàn),返回的DataFrame的列名實際上是MultiIndex,第一層是mean和max,第二層是大學的四個等級,如果需要查詢里面某一行的值,也只要按這個順序來查詢即可:
new_df['mean']['First Tier Top Unversity'].head()
??我們發(fā)現(xiàn)這實際上是一個Series的格式,那么我們在Series中用到的定位最大值或者最小值的函數(shù).idxmax()和.idxmin()就可以在這使用:
print(new_df['mean']['First Tier Top Unversity'].idxmax())
print(new_df['mean']['First Tier Top Unversity'].idxmin())
5.4 更換數(shù)據(jù)透視表的形狀( .stack() & .unstack() )
我們看到前面的數(shù)據(jù)透視表中,mean、max和四個大學是列變量,而城市是索引變量,但如果我們想要讓城市變成列變量,其他變成索引變量呢?我們先介紹兩個概念,innermost row index(最細索引變量)和lowermost column index(最細列變量),如下所示:
-
.stack()數(shù)據(jù)透視表中有一個功能是.stack(),簡而言之,它會把最細的列變量變成最細的索引變量,(注意:此時原來的country變量就不再是innermost row index了)中,如下:
new_df.stack().head(10)
我們可以看到,本來在mean和max下的四個大學等級就到了索引變量下,形成了MultiIndex,再次進行.stack()
??這次連mean和max都到了索引下面去了。
-
.unstack()有stack,自然就有.unstack(),unstack()與stack()相反,它會把最細的索引變量放到列變量去,我們對new_df進行.unstack()操作看看會發(fā)生什么:
new_df.unstack()
??有沒有很奇怪,為什么變成了一個Series?
還記得我們說過DataFrame中row和columns實際上是等價的,在這里,所有的索引變量都到列變量去了,沒了索引變量,DataFrame自然就成了一個原DataFrame中列變量作index的Series,這時如果把這個Series想象成一般形式的DataFrame,那這三個index也可以看作新的DataFrame中的index,所以,如果我們再進行一次.unstack(),它就會又變成DataFrame了:
??在這里我們就可以看到,原本Series中的最細的index:country就變成了列變量,所以,理論上我們可以添加若干個.unstack(),依舊能得到DataFrame,但若干個.stack()一定是不行的,因為你不能對Series進行.stack():
六、Pandas里的時間(Date/Time Functionality)
pandas中的時間函數(shù)主要分為四個class:
Timestamp, Period, 以及這兩種時間所對應(yīng)的index:Datetimeindex和Periodindex。
6.1 時間戳(pd.Timestamp()與.isoweekday())
如果想創(chuàng)建一個時間戳,利用pd.Timestamp()就可以了:
pd.Timestamp('9/1/2019 10:05AM')
pd.Timestamp('2019/1/20 10:05AM')
pd.Timestamp('2019-1-9 10:05AM')
pd.Timestamp('20190109 10:05AM')
pd.Timestamp('01-09-2019 10:05AM')
pd.Timestamp('2021 2 SEPT')
以上幾種都是可以的,可以發(fā)現(xiàn)Pandas支持歐式時間表達式和美式時間表達式,最后得到的都是’yyyy-mm-dd hh:mm:ss’的Timestamp格式 也可以通過直接給’yyyy-mm-dd hh:mm:ss’賦值的方法創(chuàng)建:
pd.Timestamp(2019, 12, 20, 0, 0)
--Outputs:
Timestamp('2019-12-20 00:00:00')
查詢的時候直接.year或者.month…就可以查詢對應(yīng)的年/月/日/時/分/秒了。
如果你想知道這是一周的第幾天,可以用.isoweekday()功能:
pd.Timestamp(2019, 12, 20, 0, 0).isoweekday()
--Outputs:
5
Timestamp也可以用Timedelta來表示時間間隔,和datetime中的timedelta是一樣的。
pd.Timestamp('9/3/2016')-pd.Timestamp('9/1/2016')
pd.Timestamp('9/2/2016 8:10AM') + pd.Timedelta('12D 3H')
6.2 周期(pd.Period())
如果我們不是對某個時間點感興趣而是對某個時間區(qū)間感興趣,可以用pd.Period(),他會自動給時間加上單位,比如’M’表示月’D’表示日,'A-DEC’表示以年為周期,可以對Period()值直接做+ -運算,會在對應(yīng)周期下進行運算:
pd.Period('2021-02')
pd.Period('2021-02')+2
pd.Period('2021-02-10')+2
6.3 時間索引之(Datetimeindex與PeriodIndex)
如果我們將Timestamp作為Series或者DataFrame的索引,那么其格式是DatetimeIndex,如果我們將Period作為Series或者DataFrame的索引,其格式是
PeriodIndex:
A=[2,3]
time1=pd.Timestamp('2021-09-11')
time2=pd.Timestamp('2021-09-23')
s=pd.Series(A,index=[time1,time2])
type(s.index)
--Outputs:
pandas.core.indexes.datetimes.DatetimeIndex
t1=pd.Period('2021-02')
t2=pd.Period('2021-02')
s=pd.Series(A,index=[t1,t2])
type(s.index)
--Outputs:
pandas.core.indexes.period.PeriodIndex
6.4 轉(zhuǎn)化成時間格式(pd.to_dayetime())
用pd.to_dayetime()可以把各種歐式時間格式、美式時間格式轉(zhuǎn)位一般的’yyyy-mm-dd’格式,如下:
time=['2021-09-10','2019/10/12','2021 2 JUNE','JULY 4, 2021','JANUARY 2 2012']
pd.to_datetime(time)
6.5 pd.offsets
可以在Timestamp后添加pd.offsets來實現(xiàn)某個功能,比如,可以用+pd.offsets.Week()來輸出一周后的日期,用+pd.offsets.MonthEnd()來查看本月的月末是哪一天
6.6 時間范圍(pd.date_range())
就像生成一個數(shù)值列表一樣,可以用pd.date_range()來生成一個時間的列表,語法是:pandas.date_range(start=None, end=None, periods=None, freq=None, tz=None, normalize=False, name=None, closed=None, **kwargs) ??設(shè)置好起始日期,區(qū)間長度periods或者頻率freq,tz還可以設(shè)置時區(qū),默認’timezone-naive’ ??例如,我們想生成2021年9月11日以后每兩個周的周末的日期,時間區(qū)間長度為9,可以用以下代碼:
time1=pd.Timestamp('2021-09-11')
pd.date_range(time1,periods=9,freq='2W-SUN')
可以直接用這個來做DataFrame的index:
time_period=pd.date_range(time1,periods=9,freq='2W-SUN')
data={<!-- -->'Count1':120+np.random.randint(-5,10,9),
'Count2':120+np.random.randint(-5,10,9),
}
dates=pd.DataFrame(data,index=time_period)
6.7 根據(jù)Datetime計算每個月的平均值(.resample())
從高頻率到低頻率可以用resample(),例如我們想計算上面DataFrame中每個月的平均值,可以用:
df.resample('M').mean()


Python“寶藏級”公眾號【Python之王】專注于Python領(lǐng)域,會爬蟲,數(shù)分,C++,tensorflow和Pytorch等等。
近 2年共原創(chuàng) 100+ 篇技術(shù)文章。創(chuàng)作的精品文章系列有:
日常收集整理了一批不錯的 Python 學習資料,有需要的小伙可以自行免費領(lǐng)取。
獲取方式如下:公眾號回復資料。領(lǐng)取Python等系列筆記,項目,書籍,直接套上模板就可以用了。資料包含算法、python、算法小抄、力扣刷題手冊和 C++ 等學習資料!
