在做数据处理的过程,包括数据过滤、数据汇总计算等都会经常用到pandas从日期属性中提取年月日。pandas做数据处理分析也不例外。
一、获取数据
import numpy as np
import pandas as pd
import pymysql
import warnings
warnings.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=6
df['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()) # 也是同样的结果