You need to enable JavaScript to run this app. PySpark 2.4.6中用Spark SQL将datetime列舍入至最近午夜的方法
优惠活动
大模型
产品
解决方案
定价
更多

PySpark 2.4.6中用Spark SQL将datetime列舍入至最近午夜的方法

适配PySpark 2.4.6 的 output_column 计算实现

核心判断逻辑

由于所有datetime_column的取值固定落在当日21:00 至 次日09:00的连续区间内,目标输出就是区间中间夹着的午夜零点,不需要做复杂的距离匹配,判断规则简单直接:

  • 若时间的小时值 ≥21,说明当前时间属于当日夜间段,对应的零点是次日0点
  • 若时间的小时值 <9,说明当前时间属于当日凌晨段,对应的零点是当日0点

具体代码实现

Spark SQL 写法

直接在查询语句中嵌入判断逻辑:

SELECT
  datetime_column,
  CASE
    WHEN hour(datetime_column) >= 21 THEN to_timestamp(date_add(to_date(datetime_column), 1))
    ELSE to_timestamp(to_date(datetime_column))
  END AS output_column
FROM 待查询的表名

注意事项:

  • PySpark 2.4.6 的to_date函数默认可直接解析yyyy-MM-dd HH:mm:ss格式的时间字段,若datetime_column为字符串类型,建议提前通过to_timestamp(datetime_column)转成标准Timestamp类型,避免格式解析误差
  • 上述逻辑无论datetime_column是String还是Timestamp类型,均可直接兼容

PySpark DataFrame API 写法

如果通过链式算子完成计算,对应代码如下:

from pyspark.sql import functions as F
result_df = input_df.withColumn(
    "output_column",
    F.when(F.hour("datetime_column") >= 21, 
           F.date_add(F.to_date("datetime_column"), 1).cast("timestamp"))
     .otherwise(F.to_date("datetime_column").cast("timestamp"))
)

样本匹配校验

对照给出的示例值,计算结果完全符合预期:

  • 2021-01-29 21:30:00:小时值21≥21,日期加1天得到2021-01-30 00:00:00
  • 2021-01-30 05:30:00:小时值5<9,取当日日期得到2021-01-30 00:00:00
  • 2021-01-01 23:25:00:小时值23≥21,日期加1天得到2021-01-02 00:00:00
  • 2021-01-02 08:59:59:小时值8<9,取当日日期得到2021-01-02 00:00:00

内容的提问来源于stack exchange,提问作者Nick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.06 01:24:01