Python学习笔记:Pandas处理时间类型之dt模块

您所在的位置:网站首页 python模块说明 Python学习笔记:Pandas处理时间类型之dt模块

Python学习笔记:Pandas处理时间类型之dt模块

2023-03-28 11:28| 来源: 网络整理| 查看: 265

Pandas.Series 对象和 DataFrame 的列数据提供了 cat、dt、str 三种属性接口(accessors),分别对应分类数据、日期时间数据和字符串数据。

通过这几个接口可以快速实现特定的功能,十分便捷。

今天先针对 dt 接口对时间模块进行学习。

一、构建测试数据集 # 创建测试数据 import pandas as pd df = pd.DataFrame({ 'id': range(5), 'time': ['2020-02-01 00:20:06', '2022-03-02 15:50:17', '2023-03-08 08:46:30', '2020-03-20 10:19:06', '2020-05-01 02:19:50'] }) # 观察数据类型 df.dtypes ''' id int64 time object ''' 二、转化为时间类型 df['time2'] = pd.to_datetime(df['time']) df['time2'] = pd.to_datetime(df['time'], format='%Y-%m-%d', errors='coerce')

经过转换后可以使用 dt 模块。

读取数据的时候,也可以直接转换为时间类型,利用参数 parse_dates。

df = pd.read_csv(r'xxx.csv', parse_dates = ['time', 'date'], encoding = 'gbk') 三、dt模块 1.星期名称 df['day_name_of_week'] = df['time'].dt.day_name() ''' 0 Saturday 1 Wednesday 2 Wednesday 3 Friday 4 Friday Name: time, dtype: object ''' 2.月份名称 df['month_name'] = df['time'].dt.month_name() ''' 0 February 1 March 2 March 3 March 4 May Name: time, dtype: object ''' 3.只保留时间(时分秒) df['only_time'] = df['time'].dt.time ''' 0 00:20:06 1 15:50:17 2 08:46:30 3 10:19:06 4 02:19:50 Name: time, dtype: object ''' 4.只保留日期(年月日)

dt.date 和 dt.normalize() 返回的都是日期,不同的是前者返回的 object 类型,而后者返回 datetime64 类型。

df['only_date'] = df['time'].dt.date ''' 0 2020-02-01 1 2022-03-02 2 2023-03-08 3 2020-03-20 4 2020-05-01 Name: time, dtype: object ''' df['only_date2'] = df['time'].dt.normalize() ''' 0 2020-02-01 1 2022-03-02 2 2023-03-08 3 2020-03-20 4 2020-05-01 Name: time, dtype: datetime64[ns] ''' 5.年、月、日 df['year'] = df['time'].dt.year df['month'] = df['time'].dt.month df['day'] = df['time'].dt.day 6.时、分、秒 df['hour'] = df['time'].dt.hour df['minute'] = df['time'].dt.minute df['second'] = df['time'].dt.second 7.一年中的第几周、一周中的第几天

dt.weekofyear 和 dt.week 均可实现计算第几周,不过未来会被 dt.isocalendar().week 替代。

df['week_of_year'] = df['time'].dt.weekofyear df['week_of_year'] = df['time'].dt.week ''' :1: FutureWarning: Series.dt.weekofyear and Series.dt.week have been deprecated. Please use Series.dt.isocalendar().week instead. df['time'].dt.weekofyear ''' df['year_week_day'] = df['time'].dt.isocalendar() ''' year week day 0 2020 5 6 1 2022 9 3 2 2023 10 3 3 2020 12 5 4 2020 18 5 ''' # 第几周 df['week_of_year'] = df['time'].dt.isocalendar().week # 第几天 df['day_of_week'] = df['time'].dt.isocalendar().day 8.一周中的第几天(另一种写法) df['day_of_week'] = df['time'].dt.dayofweek df['day_of_week'] = df['time'].dt.weekday

注意: dt.isocalendar().day 和 dt.dayofweek 的区别在于差1天,前者符合星期一、二、三,后者从周日算为第1天。

因此,筛选周六日的数据可以通过:

df['week'] = df['time'].dt.dayofweek df = df[df['week'].isin([5, 6])] # 周一为0、周日为6 df.drop(columns='week', inplace=True) 9.一年中的第几天 df['day_of_year'] = df['time'].dt.dayofyear 10.季度 df['quarter'] = df['time'].dt.quarter 11.每月(年、季度)的第一天、最后一天 df['is_month_start'] = df['time'].dt.is_month_start df['is_month_end'] = df['time'].dt.is_month_end df['is_year_start'] = df['time'].dt.is_year_start df['is_year_end'] = df['time'].dt.is_year_end df['is_quarter_start'] = df['time'].dt.is_quarter_start df['is_quarter_end'] = df['time'].dt.is_quarter_end 12.是否闰年 df['is_leap_year'] = df['time'].dt.is_leap_year 13.时间取整

对时间数据进行舍入求整到指定的时间频率,freq 参数不可或缺。

# 语法 df['time'].dt.round(freq='H') ''' S -- 秒 min -- 分钟 等同于 T H -- 小时 D -- 天 ''' # round 四舍五入 df['time'].dt.round(freq='H') # floor 向下取整 df['time'].dt.floor(freq='H') # ceil 向上取整 df['time'].dt.ceil(freq='H')

更多详细的时间频率可参考:freq

14.total_seconds

时间差才有总秒数这个概念,时间没有这个概念。

具体可参考:Python学习笔记:timedelta类相关函数

参考链接:Python数据分析库pandas高级接口dt的使用

参考链接:pandas时间类型数据处理,dt模块

参考链接:pandas 如何使用 dt 对象?

参考链接:Series.dt.weekday_name

参考链接:Python-Pandas关于时间格式数据的保留位数操作



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3