Python Pandas – 返回毫秒取整的新Timedelta
在我们的日常开发中,经常需要使用 Pandas 库进行数据处理。而 Pandas 中的 Timedelta 类是表示时间差的数据类型,像一些时间戳的差值也可以用 Timedelta 表示。然而,Pandas 中提供的 Timedelta 仅能精确到微秒,这使得我们如何快速对时间进行毫秒级的取整操作呢?本篇文章将向大家介绍如何使用 Pandas 对毫秒进行取整,让我们的代码更为精确。
Timedelta 的使用
在开始了解毫秒取整的方法之前,先简单了解一下 Pandas 中的 Timedelta 的使用。Timedelta 可以用于表示时间差和时间偏移,并且可以进行加减运算。我们可以通过将字符串、整数或 float 类型的值转换为 Timedelta 。下面是一个示例:
import pandas as pd
# 表示两个时间戳的差值为 5 秒
delta = pd.Timestamp('2021-10-01 12:00:05') - pd.Timestamp('2021-10-01 12:00:00')
print(delta)
# Timedelta('0 days 00:00:05')
上述示例可以看到,两个时间戳的差值被表示成了一个 Timedelta 对象。
# 可以使用字符串、整数、float 类型的值来创建 Timedelta 对象,以下分别表示一分钟、半分钟、十秒钟、三微秒、10 毫秒
td1 = pd.Timedelta('1 minute')
td2 = pd.Timedelta('30.5s')
td3 = pd.Timedelta('10 seconds')
td4 = pd.Timedelta('3 us')
td5 = pd.Timedelta('10ms')
print(td1, td2, td3, td4, td5)
# Timedelta('0 days 00:01:00') Timedelta('0 days 00:00:30.500000') Timedelta('0 days 00:00:10') Timedelta('0 days 00:00:00.000003') Timedelta('0 days 00:00:00.010000')
返回毫秒取整的新 Timedelta
Pandas 中提供的 Timedelta 只能精确到微秒,但我们很常见的场景是需要对时间进行毫秒级的取整。比如一个从 ETL 导入的带有毫秒的时间戳数据,如果需要按照天、小时、分钟等等进行统计分析,就需要对时间进行取整操作。那么,在 Pandas 中如何实现毫秒的取整操作呢?
Pandas 中提供了 timedelta.resolution 属性,该属性表示可以表达的最小时间长度,其默认值为微秒。我们可以通过设置该属性将 resolution 的值设置为毫秒,这样就可以方便实现毫秒级的取整操作。下面是一个示例:
# 设置 resolution 为毫秒,而不是默认的微秒
pd.Timedelta.resolution = pd.offsets.Millisecond()
# 从字符串转换为 Timedelta 对象
td = pd.Timedelta('1.2311s')
print(td)
# 0 days 00:00:01.231100
# 进行毫秒取整操作
td_ms = td.round('1ms')
print(td_ms)
# 0 days 00:00:01.231000
上述示例中,首先通过设置 pd.Timedelta.resolution = pd.offsets.Millisecond() 将 Timedelta 的 resolution 属性设置为毫秒级别,然后利用 round() 方法对毫秒进行取整操作,实现毫秒级别的精度。
在上述示例中,我们在使用利用 pd.Timedelta.resolution 属性对 Timedelta 库进行修改,这种修改会在整个代码中生效,可能会对多个模块进行影响。而我们在一些临时操作中只需要指定某个 Timedelta 对象的精度即可。这时,我们可以使用 pd.Timedelta 的 floor() 和 ceil() 方法。两个方法均可以将 Timedelta 对象固定到毫秒级或其他精度级别的倍数。
下面是一个使用 floor() 和 ceil() 方法进行毫秒级别的取整的示例:
# 将 Timedelta 固定到毫秒级别的最小时间单位上
td_floor = pd.Timedelta('1.2311s').floor('1ms')
print(td_floor)
# 0 days 00:00:01.231000
# 将 Timedelta 固定到毫秒级别的最大时间单位上
td_ceil = pd.Timedelta('1.2311s').ceil('1ms')
print(td_ceil)
# 0 days 00:00:01.232000
在上述示例中,floor() 方法将 Timedelta 固定到精度的最小值上并向下取整,而 ceil() 方法将 Timedelta 固定到精度的最大值上并向上取整。
结论
以上是 Pandas 中如何进行毫秒取整操作的一些方法。通过设置 pd.Timedelta.resolution 属性、使用 round() 方法、以及使用 floor() 和 ceil() 方法,我们可以很方便地进行毫秒级别的时间取整操作,使得我们的数据处理更加精确,也更符合实际场景的需要。
极客笔记