如何在PySpark中将时间戳向下取整至整点?
解决方案:将时间戳向下取整至整点
当然可以实现!你遇到的问题根源在于round()采用的是四舍五入规则,而你需要的是向下取整(截断)——不管分钟数是多少,都保留当前小时的起始时间。这里有两种简单直接的解决办法:
方法1:替换round为floor
floor()函数会直接舍去小数部分,只保留整数部分,正好匹配你的需求。修改后的代码如下:
df.withColumn("Full Hour", hour((floor(unix_timestamp("Timestamp")/3600)*3600).cast("timestamp")))
举个实际例子:23:56对应的unix时间戳除以3600后是23.933...,经过floor()处理后变为23,再乘以3600转回时间戳就是23:00:00,提取小时后得到23,完全符合你的预期。
方法2:使用更简洁的date_trunc函数
Spark内置的date_trunc函数可以直接将时间截断到指定精度(这里是小时),用法更直观,可读性更强:
from pyspark.sql.functions import date_trunc, hour df.withColumn("Full Hour", hour(date_trunc("hour", "Timestamp")))
date_trunc("hour", "Timestamp")会直接把任意时间戳转换为当前小时的整点时间(比如2023-10-01 23:56:00会变成2023-10-01 23:00:00),再用hour()提取小时数即可。
两种方法都能解决问题,个人更推荐第二种,因为代码更简洁,不需要手动处理unix时间戳的转换逻辑。
内容的提问来源于stack exchange,提问作者EchoCache
相关产品推荐
相关产品推荐

