Python Pandas – 返回带有分钟上取整解析的新时间差
在处理日期和时间数据时,经常需要进行取整操作。例如,将时间戳上取整到小时、分钟或秒。Pandas库中提供了一个非常方便的函数 pd.Timedelta,该函数可以返回带有分钟上取整解析的新时间差。
pd.Timedelta 的基本用法
pd.Timedelta 提供了从文本字符串或数字生成时间差的方法。
import pandas as pd
# 生成 60 秒时间差的三种方法
delta1 = pd.Timedelta(60, unit='s') # 直接传递数字和单位
delta2 = pd.Timedelta(seconds=60) # 传递参数名称+值的形式
delta3 = pd.to_timedelta('60s') # 从字符串解析
print(delta1, delta2, delta3, sep='\n')
上面的代码中,我们使用了三种方法来生成一个时间差为 60 秒的对象。
输出结果为:
0 days 00:01:00
0 days 00:01:00
0 days 00:01:00
我们可以看到,三种方法生成的时间差对象是一致的。
pd.Timedelta 中的分钟上取整
与小时上取整类似,分钟上取整也经常用于时间戳数据。Pandas库中提供了一个函数 pd.Timedelta.floor,该函数可以将纳秒或微秒级别的时间戳上取整到分钟。
import pandas as pd
import numpy as np
# 生成一个随机时间戳序列
df = pd.DataFrame({'time': pd.date_range(start='2022-01-01', periods=10, freq='12H') + np.random.randint(30, size=10)})
print(df)
# 将时间戳上取整到分钟
df['time_rounded'] = df['time'].dt.floor('T')
print(df)
上述代码中,我们生成了一个包含 10 个随机时间戳的数据框,每个时间戳加上了一个随机的秒数,然后将它们按照 12 小时的间隔排列。接着,我们使用 df['time'].dt.floor('T') 将时间戳上取整到分钟,并将结果保存到一个名为 time_rounded 的新列中。
输出结果为:
time
0 2022-01-01 00:18:00
1 2022-01-01 12:29:00
2 2022-01-02 00:09:00
3 2022-01-02 12:01:00
4 2022-01-03 00:08:00
5 2022-01-03 12:12:00
6 2022-01-04 00:16:00
7 2022-01-04 12:13:00
8 2022-01-05 00:03:00
9 2022-01-05 12:18:00
time time_rounded
0 2022-01-01 00:18:00 2022-01-01 00:18:00
1 2022-01-01 12:29:00 2022-01-01 12:29:00
2 2022-01-02 00:09:00 2022-01-02 00:09:00
3 2022-01-02 12:01:00 2022-01-02 12:01:00
4 2022-01-03 00:08:00 2022-01-03 00:08:00
5 2022-01-03 12:12:00 2022-01-03 12:12:00
6 2022-01-04 00:16:00 2022-01-04 00:16:00
7 2022-01-04 12:13:00 2022-01-04 12:13:00
8 2022-01-05 00:03:00 2022-01-05 00:03:00
9 2022-01-05 12:18:00 2022-01-05 12:18:00
我们可以看到,新生成的 time_rounded 列中的时间戳已经被上取整到分钟,且保留了与原时间戳相同的日期信息。
使用 Lambda 函数实现更高级的分钟上取整逻辑
pd.Timedelta 中默认的分钟上取整方式是直接向下取整,因此如果需要实现不同的分钟上取整逻辑,需要通过 Lambda 函数自定义处理方式。例如,将时间戳向上取整到最近的整分钟。
import pandas as pd
# 生成包含 10 个时间戳的数据框
df = pd.DataFrame({'time': pd.date_range(start='2022-01-01', periods=10, freq='30s')})
print(df)
# 自定义 Lambda 函数实现向上取整到最近的整分钟
round_to_nearest_minute = lambda x: x + pd.Timedelta(minutes=1) - pd.Timedelta(seconds=x.second, microseconds=x.microsecond)
# 将时间戳上取整到分钟
df['time_rounded'] = df['time'].apply(round_to_nearest_minute)
print(df)
上述代码中,我们生成了一个包含 10 个每 30 秒生成的时间戳的数据框。接着,我们用一个 Lambda 函数 round_to_nearest_minute 实现了将时间戳向上取整到最近的整分钟的逻辑。最后,我们将该函数应用到 df['time'] 列上,并将结果保存到一个名为 time_rounded 的新列中。
输出结果为:
time
0 2022-01-01 00:00:00.000
1 2022-01-01 00:00:30.000
2 2022-01-01 00:01:00.000
3 2022-01-01 00:01:30.000
4 2022-01-01 00:02:00.000
5 2022-01-01 00:02:30.000
6 2022-01-01 00:03:00.000
7 2022-01-01 00:03:30.000
8 2022-01-01 00:04:00.000
9 2022-01-01 00:04:30.000
time time_rounded
0 2022-01-01 00:00:00 2022-01-01 00:01:00.000
1 2022-01-01 00:00:30 2022-01-01 00:01:00.000
2 2022-01-01 00:01:00 2022-01-01 00:02:00.000
3 2022-01-01 00:01:30 2022-01-01 00:02:00.000
4 2022-01-01 00:02:00 2022-01-01 00:03:00.000
5 2022-01-01 00:02:30 2022-01-01 00:03:00.000
6 2022-01-01 00:03:00 2022-01-01 00:04:00.000
7 2022-01-01 00:03:30 2022-01-01 00:04:00.000
8 2022-01-01 00:04:00 2022-01-01 00:05:00.000
9 2022-01-01 00:04:30 2022-01-01 00:05:00.000
我们可以看到,新生成的 time_rounded 列中的时间戳已经被上取整到分钟,并且向上取整到了最近的整分钟。
结论
在 Pandas库中,使用 pd.Timedelta 可以非常方便地生成时间差对象,并使用 pd.Timedelta.floor 可以将时间戳上取整到分钟,同时保留日期信息。如果需要实现更高级的分钟上取整逻辑,可以使用 Lambda 函数自定义处理方式。使用 Pandas 库提供的这些功能,可以方便地处理日期和时间数据,并将其与其他数据进行关联或计算。
极客笔记