如何用Python将Pandas DataFrame的时分格式转为整点结束格式?
更Pythonic的实现方案
当然有更简洁优雅的实现方式!我们可以直接利用Pandas内置的时间序列处理能力,避免手动计算小时增量,代码可读性和效率都会更高。
需求回顾
从你的示例来看,DateTime2的生成规则是:
- 如果
DateTime本身是整点(分钟数为0),则保持原时间; - 如果
DateTime是非整点(分钟数≥15),则向上取整到下一个整点。
一行代码实现
首先确保DateTime列是datetime类型(如果还未转换的话),然后直接使用dt.ceil()方法:
# 确保DateTime列为datetime格式 df['DateTime'] = pd.to_datetime(df['DateTime']) # 生成DateTime2列,向上取整到最近的整点 df['DateTime2'] = df['DateTime'].dt.ceil('H')
为什么这更Pythonic?
- 语义清晰:
dt.ceil('H')直接表达了“向上取整到小时”的业务意图,任何人看代码都能立刻理解逻辑; - 无冗余代码:不需要生成中间临时列(比如你的
hrAdder),减少内存占用,代码更简洁; - 内置优化:Pandas的时间序列方法是经过底层优化的,比手动判断+增量计算的效率更高。
特殊场景适配(如果需要)
如果你的规则是仅当分钟数≥15时才向上取整,分钟数<15则保留当前小时(比如0:05要保留为0:00),可以用np.where结合dt.floor和dt.ceil实现:
df['DateTime2'] = np.where( df['DateTime'].dt.minute >= 15, df['DateTime'].dt.ceil('H'), df['DateTime'].dt.floor('H') )
验证结果
用你的示例数据测试,上述代码生成的DateTime2完全匹配你想要的输出:
1/1/2018 0:00→1/1/2018 0:001/1/2018 0:15→1/1/2018 1:001/1/2018 1:45→1/1/2018 2:001/1/2018 2:00→1/1/2018 2:00
内容的提问来源于stack exchange,提问作者Zanam
相关产品推荐
相关产品推荐

