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
相关产品推荐
相关产品推荐

