You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将时间四舍五入至最近20分钟间隔?含Pandas应用需求

按20分钟间隔四舍五入时间(中点向上取整)的Pandas实现

需求说明

需将时间四舍五入至最近的20分钟间隔,核心规则:处于间隔中点时向上取整(如12:10需转为12:20),具体示例如下:

给定时间四舍五入后
12:05 pm12:00 pm
12:10 pm12:20 pm
12:21 pm12:20 pm
12:33 pm12:40 pm
12:43 pm12:40 pm
12:50 pm1: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)

内容的提问来源于stack exchange,提问作者Lin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 04:10:58