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

如何过滤纽约出租车数据集,排除非9-17点上下车记录

解决纽约出租车数据时间范围过滤问题

首先纠正你之前的两个核心误区:

  • withColumn 是用来新增或修改列的,不是用来过滤行记录的,过滤行应该用 filter(或 where,两者等价)
  • Spark 的 Column 对象是 SQL 表达式容器,不能直接调用 Python datetime 的 .time() 方法,得用 Spark 内置函数或者封装成 UDF 来处理

下面给两种可行的实现方案,优先推荐第一种(效率更高):

方案一:使用 Spark 内置函数(推荐)

利用 Spark 提供的时间处理函数直接构造过滤条件,无需自定义 Python 函数,执行效率远高于 UDF(因为内置函数在 JVM 端运行)。

简化版:按小时范围过滤

如果只需要判断小时是否在 9-17 之间(包含边界),可以用 hour() 函数提取小时后直接筛选:

from pyspark.sql import functions as F

# 保留上下车时间都在9:00-17:00范围内的记录
filtered_taxi = taxi_raw.filter(
    F.hour("pickup_datetime").between(9, 17) &
    F.hour("dropoff_datetime").between(9, 17)
)

精确版:按完整时间点过滤

如果需要严格匹配「9:00:00 ≤ 时间 ≤17:00:00」(比如排除 17:00:01 这类记录),可以拼接日期和固定时间后比较:

from pyspark.sql import functions as F

# 构造当天9点和17点的时间戳
pickup_start = F.concat(F.to_date("pickup_datetime"), F.lit(" 09:00:00")).cast("timestamp")
pickup_end = F.concat(F.to_date("pickup_datetime"), F.lit(" 17:00:00")).cast("timestamp")
dropoff_start = F.concat(F.to_date("dropoff_datetime"), F.lit(" 09:00:00")).cast("timestamp")
dropoff_end = F.concat(F.to_date("dropoff_datetime"), F.lit(" 17:00:00")).cast("timestamp")

# 过滤符合条件的记录
filtered_taxi = taxi_raw.filter(
    (F.col("pickup_datetime") >= pickup_start) &
    (F.col("pickup_datetime") <= pickup_end) &
    (F.col("dropoff_datetime") >= dropoff_start) &
    (F.col("dropoff_datetime") <= dropoff_end)
)

方案二:使用自定义 UDF(仅当内置函数无法满足需求时用)

如果一定要用自定义逻辑,需要把函数封装成 Spark UDF(用户自定义函数),注意处理空值情况:

from pyspark.sql import functions as F
from pyspark.sql.types import BooleanType
import datetime

# 定义判断时间是否在范围内的函数
def is_time_valid(dt):
    if dt is None:  # 处理空值,直接标记为无效
        return False
    current_time = dt.time()
    return datetime.time(9, 0, 0) <= current_time <= datetime.time(17, 0, 0)

# 封装成UDF
is_valid_pickup = F.udf(is_time_valid, BooleanType())
is_valid_dropoff = F.udf(is_time_valid, BooleanType())

# 过滤记录
filtered_taxi = taxi_raw.filter(
    is_valid_pickup(F.col("pickup_datetime")) &
    is_valid_dropoff(F.col("dropoff_datetime"))
)

注意事项

  • 优先用方案一,大数据量下 UDF 会因为 Python 和 JVM 之间的序列化/反序列化开销导致性能下降
  • 过滤条件是「保留上下车时间都在范围内」,如果需求是排除「任一时间不在范围内」的记录,逻辑和上面一致(因为 & 表示同时满足两个条件)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:45:41