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

PySpark中如何将'%Y-%m-%d %H.%M.%S'时间戳转为'%Y-%m-%d %H:%M:%S'并过滤

解决PySpark中'%Y-%m-%d %H.%M.%S'格式时间戳的过滤问题

你的问题核心是:Spark的TimestampType字段无法直接识别%Y-%m-%d %H.%M.%S格式的字符串,导致用该格式写的过滤条件无法匹配数据。下面提供两种可行的解决方法:

方法1:字符串替换转换格式

直接将输入的点分隔时间字符串中的.替换为:,转换成Spark能识别的标准时间格式后再构建过滤条件:

from pyspark.sql.types import *
from datetime import datetime

mySchema = StructType([
    StructField("tranid", IntegerType()),                     
    StructField("trandate", TimestampType()),
])

data = [
    (1,datetime.strptime('2021-04-20 10:00:00', '%Y-%m-%d %H:%M:%S')),
    (2,datetime.strptime('2022-05-20 11:01:00', '%Y-%m-%d %H:%M:%S')),
    (3,datetime.strptime('2022-06-21 09:02:00', '%Y-%m-%d %H:%M:%S')),
    (4,datetime.strptime('2022-06-28 09:55:00', '%Y-%m-%d %H:%M:%S'))
]

df=spark.createDataFrame(data, mySchema)
df.show(3,False)

# 替换点为冒号
target_time = '2021-05-21 09.01.00'
# 只替换时分秒部分的两个点
formatted_time = target_time.replace('.', ':', 2)
filter_condition2 = f"trandate > '{formatted_time}'"
print(filter_condition2)
df.where(filter_condition2).show(3,False)

方法2:使用Spark内置函数转换(更推荐)

避免字符串拼接的潜在风险,用to_timestamp函数将点格式的字符串直接转为Timestamp类型后再比较,这种方式更符合Spark的API规范:

from pyspark.sql.functions import to_timestamp

# 用to_timestamp解析点格式时间后比较
target_time = '2021-05-21 09.01.00'
df.where(df['trandate'] > to_timestamp(target_time, 'yyyy-MM-dd HH.mm.ss')).show(3,False)

说明

  • 方法1适合快速处理单个时间字符串,批量处理或追求严谨性时优先选方法2。
  • to_timestamp的第二个参数需严格匹配输入时间的格式,这里yyyy-MM-dd HH.mm.ss对应你的%Y-%m-%d %H.%M.%S格式,能准确解析为Timestamp类型后与字段值比较。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 10:27:12