Python Pandas – 对 TimeDeltaIndex 做毫秒级频率的 ceil 运算

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 序列类型的数据。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程