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

Pandas:将时间戳向上取整至最近小时(分钟≥30进一位)

解决时间戳分钟向上取整到小时的问题

首先,咱们先梳理下你当前代码里的几个小问题,再一步步修正并实现需求:

原函数的问题点

  • 变量名用了min,这是Python的内置函数,会覆盖掉这个内置方法的功能,建议换成minute这类不会冲突的名字。
  • 拆分时分的逻辑有误:time.strip(':')[1]会把字符串里的冒号全部移除(比如05:18变成0518),取索引1的字符只是单个数字,不是完整的分钟数。正确的做法是用split(':')来拆分小时和分钟字符串。

修正后的自定义函数实现

先把函数调整正确,再通过apply生成目标列:

import pandas as pd

# 确保start_time是datetime类型,若不是先转换
# df['start_time'] = pd.to_datetime(df['start_time'])

def extract_time(col):
    # 拆分出小时和分钟的字符串
    hour_str, minute_str = col.strftime('%H:%M').split(':')
    hour = int(hour_str)
    minute = int(minute_str)
    if minute >= 30:
        # 处理23:30及以上的情况,可选转为0或保留24,这里转为0
        return hour + 1 if hour < 23 else 0
    return hour

# 生成hour列
df['hour'] = df['start_time'].apply(extract_time)

用你的示例数据测试,得到的hour列结果为[5,7,8,15,16],完全符合需求。

更高效的Pandas内置方法(推荐)

如果你的数据量较大,apply的运行效率会偏低,推荐直接用Pandas的dt访问器处理,无需自定义函数:

# 提取小时,再根据分钟数判断是否加1
df['hour'] = df['start_time'].dt.hour + (df['start_time'].dt.minute >= 30).astype(int)
# 处理23:30转为0的场景
df['hour'] = df['hour'].replace(24, 0)

这种写法更贴合Pandas的向量式操作风格,运行速度比apply快很多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:00:36