You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PySpark中把Timestamp列四舍五入到最近30秒?

实现PySpark DataFrame时间戳四舍五入到最近30秒

当然可以实现这个需求!在PySpark里,咱们可以通过时间戳的数值化运算轻松完成四舍五入到最近30秒的操作,下面是具体的实现步骤和代码示例:

核心思路

把timestamp类型的列转换成Unix时间戳(即从1970-01-01 00:00:00 UTC开始的总秒数),然后通过数学运算完成四舍五入:

  1. 将秒数除以30,得到以30秒为单位的数值
  2. 对这个数值做四舍五入,得到最近的30秒单位数
  3. 再乘以30转换回总秒数
  4. 最后把秒数转换回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:53:47