在做数据处理的过程,包括数据过滤、数据汇总计算等都会经常用到pandas从日期属性中提取年月日。pandas做数据处理分析也不例外。
一、获取数据
import numpy as npimport pandas as pdimport pymysqlimport warningswarnings.filterwarnings("ignore")#查看某个函数、方法的详细使用。如输入pd.read_csv,然后按shift+tab(4次)#连接数据库(mysql)con = pymysql.connect(host = '127.0.0.1',port=3306, user='root',passwd='131129',db='znf', use_unicode=True,charset='utf8')# 查询数据sql = '''SELECT 产品编号, 单位, 规格, 售价, 是否赠品, 创建时间 FROM 在售产品; '''# 执行查询df = pd.read_sql_query(sql,con = con)#随机抽取5行display(df.sample(5))#查询每一列的数据类型print(df.dtypes,"\n------------")print(df["创建时间"].dtypes,"\n------------")#查询表格大小print(df.shape,"\n------------")#查询是否有空值print(df.info(),"\n------------")#获取基本统计信息display(df.describe())
二、日期函数表
将str类型/object类型转换为datetime类型,提取年月日时分秒
属性 | 说明 |
---|---|
year | datetime 的年 |
month | datetime 的月 |
day | datetime 的日 |
hour | datetime 的小时 |
minute | datetime 的分钟 |
second | datetime 的秒 |
microsecond | datetime 的微秒 |
nanosecond | datetime 的纳秒 |
date | 返回 datetime.date(不包含时区信息) |
time | 返回 datetime.time(不包含时区信息) |
timetz | 返回带本地时区信息的 datetime.time |
dayofyear | 一年里的第几天 |
weekofyear | 一年里的第几周 |
week | 一年里的第几周 |
dayofweek | 一周里的第几天,Monday=0, Sunday=6 |
weekday | 一周里的第几天,Monday=0, Sunday=6 |
weekday_name | 这一天是星期几 (如,Friday) |
quarter | 日期所处的季节:Jan-Mar = 1,Apr-Jun = 2 等 |
days_in_month | 日期所在的月有多少天 |
is_month_start | 逻辑判断是不是月初(由频率定义) |
is_month_end | 逻辑判断是不是月末(由频率定义) |
is_quarter_start | 逻辑判断是不是季初(由频率定义) |
is_quarter_end | 逻辑判断是不是季末(由频率定义) |
is_year_start | 逻辑判断是不是年初(由频率定义) |
is_year_end | 逻辑判断是不是年末(由频率定义) |
is_leap_year | 逻辑判断是不是日期所在年是不是闰年 |
# 将str类型/object类型转换为datetime类型,提取年月日时分秒#先转化为datetime类型,默认format='%Y-%m-%d %H:%M:%S'df["datetime"]=pd.to_datetime(df["创建时间"],errors="coerce")print(df["创建时间"].dtypes,"\n------------")df['date'] = df['datetime'].dt.date #转化提取年-月-日df['year'] =df['datetime'].dt.year.fillna(0).astype("int") #转化提取年 ,#如果有NaN元素则默认转化float64型,要转换数据类型则需要先填充空值,在做数据类型转换df['month'] = df['datetime'].dt.month.fillna(0).astype("int") #转化提取月df['%Y_%m'] = df['year'].map(str) + '-' + df['month'].map(str) #转化获取年-月df['day'] = df['datetime'].dt.day.fillna(0).astype("int") #转化提取天df['hour'] = df['datetime'].dt.hour.fillna(0).astype("int") #转化提取小时df['minute'] = df['datetime'].dt.minute.fillna(0).astype("int") #转化提取分钟df['second'] = df['datetime'].dt.second.fillna(0).astype("int") #转化提取秒df['dayofyear'] = df['datetime'].dt.dayofyear.fillna(0).astype("int") #一年中的第n天df['weekofyear'] = df['datetime'].dt.weekofyear.fillna(0).astype("int") #一年中的第n周df['weekday'] = df['datetime'].dt.weekday.fillna(0).astype("int") #周几,一周里的第几天,Monday=0, Sunday=6df['quarter'] = df['datetime'].dt.quarter.fillna(0).astype("int") #季度display(df.head())
三、统一格式按照长度截取
# 利用字符串截取原理,提取年月日时分秒#为了统一日期格式,先转化为datetime,并处理NaN元素#先转化为datetime类型,默认format='%Y-%m-%d %H:%M:%S'df['datetime'] = pd.to_datetime(df['创建时间'],errors='coerce').fillna("0000-00-00 00:00:00")#转化为字符串类型,利用截取字符串获取年月日时分秒df['date'] = df['datetime'].astype("str").str[0:10] #截取年-月-日df['%Y-%m'] = df['datetime'].astype("str").str[0:7] #截取年-月df['day'] = df['datetime'].astype("str").str[8:10] #截取日df['hour'] = df['datetime'].astype("str").str[11:13] #截取日display(df.head()) # 也是同样的结果