Python中DataFrame时间戳取整至最近小时的实现方法
把DataFrame中的时间戳取整到最近的小时
嘿,这个需求我之前处理过好几次,给你分享两个实用的方法,完全能匹配你的要求:
方法一:用pandas原生的dt.round()(最简便)
pandas的datetime系列自带的round()方法特别适合这个场景,只要指定频率为'H'(小时),它就会自动按四舍五入规则取整——分钟数小于30就舍到当前小时,大于等于30就进到下一小时,刚好对应你给出的例子:0:16舍到0:00,1:56进到2:00。
示例代码:
import pandas as pd # 构造示例数据(如果你的时间列已经是datetime类型,可以跳过转换步骤) df = pd.DataFrame({ 'timestamp': ['2017-11-18 0:16', '2017-11-18 1:56'] }) # 关键步骤:把字符串格式的时间转成datetime类型 df['timestamp'] = pd.to_datetime(df['timestamp']) # 取整到最近的小时 df['rounded_hour'] = df['timestamp'].dt.round('H')
运行后得到的结果:
| timestamp | rounded_hour |
|---|---|
| 2017-11-18 00:16:00 | 2017-11-18 00:00:00 |
| 2017-11-18 01:56:00 | 2017-11-18 02:00:00 |
完全符合你的预期~
方法二:自定义取整逻辑(更灵活)
如果之后你需要调整取整规则(比如改成分钟≥20就进位),可以用floor()和ceil()结合自定义判断来实现:
df['rounded_hour'] = df['timestamp'].apply( lambda x: x.ceil('H') if x.minute >= 30 else x.floor('H') )
这个方法和round()的效果在你的需求下完全一致,但好处是规则完全由你掌控,想改阈值直接修改30这个数字就行。
小提醒
一定要确保你的时间列是datetime64类型,如果是字符串格式,必须先用pd.to_datetime()转换,不然无法使用这些dt开头的方法哦。
内容的提问来源于stack exchange,提问作者user123
相关产品推荐
相关产品推荐

