如何在PySpark中把Timestamp列四舍五入到最近30秒?
实现PySpark DataFrame时间戳四舍五入到最近30秒
当然可以实现这个需求!在PySpark里,咱们可以通过时间戳的数值化运算轻松完成四舍五入到最近30秒的操作,下面是具体的实现步骤和代码示例:
核心思路
把timestamp类型的列转换成Unix时间戳(即从1970-01-01 00:00:00 UTC开始的总秒数),然后通过数学运算完成四舍五入:
- 将秒数除以30,得到以30秒为单位的数值
- 对这个数值做四舍五入,得到最近的30秒单位数
- 再乘以30转换回总秒数
- 最后把秒数转换回timestamp类型
代码实现
from pyspark.sql import SparkSession from pyspark.sql.functions import col, unix_timestamp, round, from_unixtime # 初始化SparkSession(如果已有活跃Session可跳过) spark = SparkSession.builder.appName("RoundTimestampTo30s").getOrCreate() # 构造测试数据(模拟你的原始DataFrame) test_data = [ ("2016-02-09 19:31:02",), ("2016-02-09 19:31:35",), ("2016-02-09 19:31:52",), ("2016-02-09 19:31:28",) ] df = spark.createDataFrame(test_data, ["original_ts"]) # 注意:如果原始列已经是timestamp类型,这一步可省略 df = df.withColumn("original_ts", col("original_ts").cast("timestamp")) # 添加四舍五入后的目标列 df = df.withColumn( "rounded_ts", from_unixtime(round(unix_timestamp(col("original_ts")) / 30) * 30).cast("timestamp") ) # 查看结果 df.show(truncate=False)
运行结果
执行代码后,输出会完全匹配你给出的示例:
+-------------------+-------------------+ |original_ts |rounded_ts | +-------------------+-------------------+ |2016-02-09 19:31:02|2016-02-09 19:31:00| |2016-02-09 19:31:35|2016-02-09 19:31:30| |2016-02-09 19:31:52|2016-02-09 19:32:00| |2016-02-09 19:31:28|2016-02-09 19:31:30| +-------------------+-------------------+
补充说明
- Spark 3.0及以上版本,也可以用
to_timestamp()替代cast("timestamp"),效果一致 - 这个方法支持任意时间间隔的四舍五入,比如要改成最近1分钟,只需把代码里的
30换成60即可
内容的提问来源于stack exchange,提问作者Ahmad Senousi
相关产品推荐
相关产品推荐

