pandas 数据表中的字符与日期数据的处理
前面我们有学习过有关字符串的处理和正在表达式,但那都是基于单个字符串或字符串列表的操作。下面将学习如何基于数据框操作字符型变量。
同时介绍一下如何从日期型变量中取出年份,月份,星期几等,如何计算两个日期的时间差。
例题如下:
针对以上数据,读者可以在不看下方代码的情况下尝试着回答这些关于字符型及日期型的问题:
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: