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

发布时间 2023-03-22 21:16:27作者: Hider1214

Pandas.Series 对象和 DataFrame 的列数据提供了 catdtstr 三种属性接口(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.datedt.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.weekofyeardt.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().daydt.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关于时间格式数据的保留位数操作