Python Pandas – 对 TimeDeltaIndex 做毫秒级频率的 ceil 运算
背景
在数据分析中,我们经常需要处理时间数据,Pandas 提供了强大的时间序列操作功能。时间序列数据通常是 TimeStamp 或 TimeDeltaIndex 类型的数据,其中 TimeStamp 代表具体的时间点,TimeDeltaIndex 代表时间跨度。在某些场景下,我们需要对 TimeDeltaIndex 做毫秒级的频率运算,比如将 100 毫秒时间段取整到 1 秒钟。这就需要用到 Pandas 中的函数 ceil。
准备工作
首先我们需要导入 Pandas 库和创建一个 TimeDeltaIndex 类型的时间序列。
import pandas as pd
import numpy as np
# 创建 TimeDeltaIndex 序列
tdi = pd.to_timedelta(np.random.randint(0, 60000, 10), unit='ms')
print(tdi)
输出结果如下,表示该时间序列中有 10 个 TimeDeltaIndex 元素,每个元素在 0~60000 毫秒之间的随机跨度。
TimedeltaIndex(['0 days 00:00:20.000000', '0 days 00:00:41.000000',
'0 days 00:00:20.000000', '0 days 00:00:29.000000',
'0 days 00:00:48.000000', '0 days 00:00:31.000000',
'0 days 00:00:51.000000', '0 days 00:00:39.000000',
'0 days 00:00:01.000000', '0 days 00:00:18.000000'],
dtype='timedelta64[ns]', freq=None)
频率运算
现在我们来对该时间序列做毫秒级频率运算,比如将 10 毫秒时间段取整到 1 秒钟。对于 TimeDeltaIndex 序列,Pandas 支持的频率字符串如下。
频率字符串 | 含义 |
---|---|
us | 微秒(microseconds) |
ns | 纳秒(nanoseconds) |
ms | 毫秒(milliseconds) |
s | 秒(seconds) |
D | 天(days) |
W | 周(weeks) |
M | 月末(month end) |
BM | 月末倒数第二个工作日(business month end) |
CBM | 定制的月末倒数第二个自定义工作日(custom business month end) |
MS | 月初(month start) |
BMS | 月初第一个工作日(business month start) |
CBMS | 定制的月初第一个自定义工作日(custom business month start) |
Q | 季度末(quarter end) |
BQ | 季度末倒数第二个工作日(business quarter end) |
QS | 季度初(quarter start) |
BQS | 季度初第一个工作日(business quarter start) |
A | 年末(year end) |
BA | 年末倒数第二个工作日(business year end) |
AS | 年初(year start) |
BAS | 年初第一个工作日(business year start) |
BH | 工作小时(business hours) |
H | 小时(hours) |
T | 分钟(minutes) |
S | 秒(seconds) |
L | 毫秒(milliseconds) |
U | 微秒(microseconds) |
N | 纳秒(nanoseconds) |
做毫秒级频率运算,我们可以使用 L(毫秒)或 U(微秒)作为频率字符串。对于当前的序列 tdi,我们可以将 10 毫秒时间段取整到 1 秒钟,方法如下。
# 将 10 毫秒时间段取整到 1 秒钟,即毫秒向上取整
tdi.ceil('1s')
TimedeltaIndex(['0 days 00:00:20.000000', '0 days 00:00:41.000000',
'0 days 00:00:20.000000', '0 days 00:00:29.000000',
'0 days 00:00:48.000000', '0 days 00:00:31.000000',
'0 days 00:00:51.000000', '0 days 00:00:39.000000',
'0 days 00:00:01.000000', '0 days 00:00:18.000000'],
dtype='timedelta64[ns]', freq=None)
我们还可以将 2 毫秒时间段取整到 1 秒钟,方法如下。
# 将 2 毫秒时间段取整到 1 秒钟,即毫秒
tdi.ceil('2ms')
TimedeltaIndex(['0 days 00:00:20.000000', '0 days 00:00:42.000000',
'0 days 00:00:20.000000', '0 days 00:00:30.000000',
'0 days 00:00:48.000000', '0 days 00:00:32.000000',
'0 days 00:00:52.000000', '0 days 00:00:40.000000',
'0 days 00:00:00.000000', '0 days 00:00:18.000000'],
dtype='timedelta64[ns]', freq=None)
结论
Pandas 的函数 ceil 可以对 TimeDeltaIndex 序列做频率运算,从而将某个时间段取整到一个更粗略的时间跨度。在运算时需要指定频率字符串,取整后得到的结果仍然是 TimeDeltaIndex 序列类型的数据。