Python学习笔记:Pandas处理时间类型之dt模块
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
'''
<ipython-input-27-8c13c3b24c47>: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 对象?