五、時(shí)間操作與時(shí)間序列
5.1 時(shí)間操作
import datetime
dt = datetime.datetime(year = 2023, month = 5, day = 11, houre = 10, minute= 57)
import pandas as pd
ts = pd.Timestamp('2023-5-7')
ts.year
ts.month
ts + pd.Timedelta('5 days')
ts + pd.Timedelta('5 day') #都可以
pd.to_datetime('2023-5-7 12:10:10') #構(gòu)造時(shí)間
pd.to_datetime('7/5/2023 12:10:10')
image.png
為什么上圖中的to_datetime變成了datetime64數(shù)據(jù)類(lèi)型复隆,而單個(gè)時(shí)間拨匆,變成的是Timestamp類(lèi)型
ts = pd.to_datetime(s)
ts.dt.hour
#結(jié)果如下
0 12
1 12
2 12
dtype: int64
ts.dt.weekday
5.2 時(shí)間序列操作
pd.Series(pd.date_range(start='2023-07-05 12:10:10',periods=10, freq='12H')) #生成10個(gè)日期,間隔是12小時(shí)
data = pd.read_csv('.data/flowdata.csv', index_col = 0, parse_dates = True) #讀取數(shù)據(jù)文件挽拂,把第0列設(shè)為index惭每,并處理成日期類(lèi)型。
data[pd.Timestamp('2012-1-1 9:00'):pd.Timestamp('2012-1-1 19:00')]
data['2013'] #取2013年數(shù)據(jù)
data['2012-12':'2013-1'] #取2012年12月到2013年1月數(shù)據(jù)
data[data.index.month ==1] #取所有月份為1月的數(shù)據(jù)
data[(data.index.hour >8) & (data.index.hour<12)]
data.between_time("08:00"亏栈,"12:00") # 會(huì)包含12點(diǎn)
data.resample('D').mean() #按天重新采樣台腥,取均值
data.resample('D').max() #按天重新采樣,取最大值
data.resample('3D').max() #三天
data.resample('M').max() #月
%matplotlib notebook #在最開(kāi)如用這個(gè)绒北,可以直接畫(huà)圖
data.resample('M').max().plot()
六黎侈、Pandas常用操作
排序
import pandas as df
data = df.DataFrame({'group':['a','a','a','b','c','c','b','c','b',],'value':[4,3,2,1,15,72,45,23,33]})
data.sort_values(by=['group', 'value'],ascending=[False,True],inplace=True)
去重復(fù)值
data=pd.DataFrame({'k1':['one']*3+['two']*4, 'k2':[1,1,2,2,3,3,4]})
data.drop_duplicates() # 各列全一樣的去掉
data.drop_duplicates(subset='k1') # k1列一樣的去掉。只保貿(mào)k1中值第一次出現(xiàn)的行
大類(lèi)合并
def food_map(series):
if series['food'] == 'a1':
return 'a'
elif series['food'] == 'a2':
return 'a'
elif series['food'] == 'a3':
return 'a'
elif series['food'] == 'b1':
return 'b'
elif series['food'] == 'b2':
return 'b'
elif series['food'] == 'b3':
return 'b'
elif series['food'] == 'c1':
return 'c'
elif series['food'] == 'c2':
return 'c'
elif series['food'] == 'c3':
return 'c'
data['food_map'] = data.apply(food_map, axis = 'columns')
如下的效果一樣
foodcategory={'a1':'A',
'a2':'A',
'a3':'A',
'b1':'B',
'b2':'B',
'b3':'B',
'c1':'C',
'c2':'C',
'c3':'C'
}
data['Category'] = data['food'].map(foodcategory)
data
列計(jì)算生成新列
import numpy as np
data = pd.DataFrame({'data1':np.random.randn(5),'data2':np.random.randn(5)})
data.assign(ration = data['data1']/ data['data2'])
生成新的DataFrame, data不變
刪除列
df2 = data.assign(ration = data['data1']/ data['data2'])
df2.drop('ration', axis='columns',inplace=True)
替換值
s = pd.Series([1,2,3,4,5,6,7])
s.replace(5,np.nan,inplace=True)
把5替換成了NaN
數(shù)據(jù)分桶
ages=[5,7,25,15,30,18,45,67,98,56,80]
bins=[1,18,35,60,80]
bin_res = pd.cut(ages,bins)
bin_res.codes
pd.value_counts(bin_res) # 查看各區(qū)段內(nèi)的數(shù)值個(gè)數(shù)
#-----------------------------------------------
(1, 18] 4
(60, 80] 2
(35, 60] 2
(18, 35] 2
dtype: int64
bin_res.labels已經(jīng)廢棄
image.png
groups=['少年','青年','中年','老年']
res2 = pd.cut(ages,bins,labels=groups)
print(res2)
print(pd.value_counts(res2))
#--------------------------------------------------------------------------------------------
[少年, 少年, 青年, 少年, 青年, ..., 中年, 老年, NaN, 中年, 老年]
Length: 11
Categories (4, object): [少年 < 青年 < 中年 < 老年]
少年 4
老年 2
中年 2
青年 2
dtype: int64
判斷是否為空
data = pd.DataFrame([range(3),[0,np.nan,0],[np.nan,0,0],range(3)])
pd.isnull(data)
data.isnull() #這兩個(gè)都可以
#-----------------------
0 1 2
0 0.0 1.0 2
1 0.0 NaN 0
2 NaN 0.0 0
3 0.0 1.0 2
0 1 2
0 False False False
1 False True False
2 True False False
3 False False False
data.isnull().any()
#-----------------------------
0 True
1 True
2 False
dtype: bool
data.isnull().any(axis='columns')
#-------------------------------------
0 False
1 True
2 True
3 False
dtype: bool
data.fillna(5)
#-----------------------
0 1 2
0 0.0 1.0 2
1 0.0 5.0 0
2 5.0 0.0 0
3 0.0 1.0 2