Python数据分析处理库-Pandas 2

五、时间操作与时间序列

5.1 时间操作

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')   #构造时间
pd.to_datetime('7/5/2023 12:10:10')
image.png

为什么上图中的to_datetime变成了datetime64数据类型,而单个时间,变成的是Timestamp类型

ts = pd.to_datetime(s)
ts.dt.hour  
#结果如下
0    12
1    12
2    12
dtype: int64
ts.dt.weekday

5.2 时间序列操作

pd.Series(pd.date_range(start='2023-07-05 12:10:10',periods=10, freq='12H')) #生成10个日期,间隔是12小时
data = pd.read_csv('.data/flowdata.csv', index_col = 0, parse_dates = True) #读取数据文件,把第0列设为index,并处理成日期类型。
data[pd.Timestamp('2012-1-1 9:00'):pd.Timestamp('2012-1-1 19:00')] 
data['2013']  #取2013年数据
data['2012-12':'2013-1'] #取2012年12月到2013年1月数据
data[data.index.month ==1] #取所有月份为1月的数据
data[(data.index.hour >8) & (data.index.hour<12)]
data.between_time("08:00","12:00") # 会包含12点
data.resample('D').mean()  #按天重新采样,取均值
data.resample('D').max() #按天重新采样,取最大值
data.resample('3D').max()   #三天
data.resample('M').max()  #月

%matplotlib notebook  #在最开如用这个,可以直接画图
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)

去重复值

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列一样的去掉。只保贸k1中值第一次出现的行

大类合并

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

列计算生成新列

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

数据分桶

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) # 查看各区段内的数值个数
#-----------------------------------------------
(1, 18]     4
(60, 80]    2
(35, 60]    2
(18, 35]    2
dtype: int64

bin_res.labels已经废弃


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()   #这两个都可以
#-----------------------
     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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容