如何将时间四舍五入至最近20分钟间隔?含Pandas应用需求
按20分钟间隔四舍五入时间(中点向上取整)的Pandas实现
需求说明
需将时间四舍五入至最近的20分钟间隔,核心规则:处于间隔中点时向上取整(如12:10需转为12:20),具体示例如下:
| 给定时间 | 四舍五入后 |
|---|---|
| 12:05 pm | 12:00 pm |
| 12:10 pm | 12:20 pm |
| 12:21 pm | 12:20 pm |
| 12:33 pm | 12:40 pm |
| 12:43 pm | 12:40 pm |
| 12:50 pm | 1:00 pm |
问题分析
你之前使用的ceil_dt函数是向上取整到下一个20分钟间隔,而非按规则四舍五入,因此会出现12:21被转为12:40的错误结果。我们需要的是真正的四舍五入逻辑,且中点值向上取整。
Pandas简便实现方案
利用Pandas的时间偏移和floor方法,仅需两步即可实现需求:
步骤1:转换时间列为datetime类型
首先确保Datetime列是Pandas的datetime格式:
import pandas as pd # 你的原始数据 data = pd.DataFrame({ 'Experiment_ID': [52.0, 52.1, 52.2, 55.0, 55.1, 55.2, 56.0, 56.1, 56.2, 56.3, 56.4, 57.0, 57.1, 57.2, 59.0, 59.1, 60.0, 61.0, 62.0, 62.1, 62.2, 63.0, 63.1, 64.0, 64.1, 64.2, 65.0, 65.1, 65.2, 66.0], 'Datetime': ['2023-02-24 11:34:00', '2023-02-24 12:37:00', '2023-02-24 13:36:00', '2023-03-08 11:13:00', '2023-03-08 12:18:00', '2023-03-08 13:18:00', '2023-03-16 10:03:00', '2023-03-16 11:03:00', '2023-03-16 11:40:00', '2023-03-16 12:06:00', '2023-03-16 13:04:00', '2023-03-22 10:56:00', '2023-03-22 12:05:00', '2023-03-22 13:09:00', '2023-04-05 11:25:00', '2023-04-05 12:35:00', '2023-04-07 12:50:00', '2023-04-11 15:00:00', '2023-04-13 10:47:00', '2023-04-13 11:47:00', '2023-04-13 12:47:00', '2023-04-19 10:45:00', '2023-04-19 13:00:00', '2023-04-20 10:36:00', '2023-04-20 11:33:00', '2023-04-20 12:35:00', '2023-04-26 10:53:00', '2023-04-26 12:01:00', '2023-04-26 12:30:00', '2023-05-11 10:22:00']}) # 转换为datetime类型 data['Datetime'] = pd.to_datetime(data['Datetime'])
步骤2:应用四舍五入逻辑
通过给时间加上10分钟(间隔的一半),再向下取整到20分钟间隔,实现中点向上取整的四舍五入:
data['Rounded_Datetime'] = (data['Datetime'] + pd.Timedelta(minutes=10)).dt.floor('20min')
验证逻辑
可以用示例时间测试效果:
test_times = pd.Series([ '2023-02-24 12:05:00', '2023-02-24 12:10:00', '2023-02-24 12:21:00', '2023-02-24 12:33:00', '2023-02-24 12:43:00', '2023-02-24 12:50:00' ]).astype('datetime64[ns]') rounded_times = (test_times + pd.Timedelta(minutes=10)).dt.floor('20min') for original, rounded in zip(test_times.dt.strftime('%H:%M'), rounded_times.dt.strftime('%H:%M')): print(f"{original} -> {rounded}")
输出结果:
12:05 -> 12:00 12:10 -> 12:20 12:21 -> 12:20 12:33 -> 12:40 12:43 -> 12:40 12:50 -> 13:00
完全符合需求规则。
原理说明
- 给时间加上间隔的一半(10分钟),相当于把四舍五入的阈值调整到间隔中点:
- 当分钟数 <10时,加10后仍小于20,
floor('20min')会取当前间隔的起始时间(如05→15→12:00) - 当分钟数 ≥10时,加10后≥20,
floor('20min')会取下一个间隔的起始时间(如10→20→12:20;33→43→12:40)
- 当分钟数 <10时,加10后仍小于20,
内容的提问来源于stack exchange,提问作者Lin
相关产品推荐
相关产品推荐

