前面我們有學習過有關字符串的處理和正在表達式,但那都是基於單個字符串或字符串列表的操作。下面將學習如何基於數據框操作字符型變量。
同時介紹一下如何從日期型變量中取出年份,月份,星期幾等,如何計算兩個日期的時間差。
例題如下:
針對以上數據,讀者可以在不看下方代碼的情況下嘗試着回答這些關於字符型及日期型的問題:
1.如何更改出生日期birthday和手機號碼tel兩個字段的數據類型
2.如何根據出生日期birthday和開始工作日期start_work兩個字段新增年齡和工齡兩個字段
3.如何將手機號tel的中間四位隱藏起來。
4.如何基於other字段取出每個人員的專業信息
代碼如下:
import pandas as pd
#數據讀入
df = pd.read_excel(r'd:data_test03.xlsx')
#各變量數據類型
df.dtypes
#將birthday變量轉換為日期型
df.birthday = pd.to_datetime(df.birthday,format = '%Y/%m/%d')
#講tel變量轉換為字符串
df.tel = df.tel.astype('str')
#新增年齡和工齡兩列
df['age']=pd.datetime.today().year - df.birthday.dt.year
df['workage'] = pd.datetime.today().year - df.start_work.dt.year
#將手機號碼中間四位隱藏起來
df.tel = df.tel.apply(func = lambda x:x.replace(x[3:7],'xxxx'))
#取出郵箱的域名
df['email_domain']=df.email.apply(func = lambda x:x.split('@')[1])
#取出人員的專業信息
df['profession'] = df.other.str.findall('專業:(.*?),') #這個地方要非常注意開始調試的時候我把(.*?)后面的逗號寫成是英文模式下的,實際上表格里面是中文模式下的,所以開 始我匹配的結果是空的,改成中文模式的逗號才顯示正常
#去除birthday,start_work和other變量
df.drop(['birthday','start_work','other'],axis = 1,inplace = True)
df
out:
1,pd.to_datetime( 要轉換的日期, format= ),
2,pd.to_datetime.today( ).year ,pd.to_datetime.now( ).year
3,字符串的astype方法:字段類型轉換,
4,日期.dt.year :必須加dt
5,刪除字段: df. drop ([ ] , axis=1, inplace=True)
df是數據框的名字,列表[ ] 里是要刪除的字段名,
axis=1表示在水平方向,因為默認drop方法是用來刪除數據庫中的行記錄,
inplace=True表示會影響原數組
6,序列的apply ( ) 方法 , apply( func= , )
7,序列使用.str后,可以轉換為字符串類型
常見的日期時間處理方法
year 返回年份
month 返回月份
day 返回月份中的日
hour 返回時
minute 返回分鍾
second 返回秒
date 返回日期
time 返回時間
dayofyear 返回年中的第幾天
dayofweek 返回周幾(0-6)
quarter 返回第幾季度
weekofyear 返回年中第幾周
weekday_name 返回具體的周幾名稱
days_in_month 返回月中多少天
示例:
import pandas as pd
dates = pd.to_datetime(pd.Series(['1989-8-18 13:14:55','1995-2-16']),format = '%Y-%m-%d %H:%M:%S')
print('返回日期值:\n',dates.dt.date)
print('返回季度:\n',dates.dt.quarter)
print('返回幾點鍾: \n',dates.dt.hour)
print('返回年中的天: \n',dates.dt.dayofyear)
print('返回年中的周:\n',dates.dt.weekofyear)
print('返回星期幾的名稱:\n',dates.dt.weekday_name)
print('返回月份的天數:\n',dates.dt.days_in_month)
out: