pyspark中timestamp字段类型过滤的细节

本文介绍两种过滤特定时间戳的方法:一种是直接使用字符串日期进行过滤;另一种是将时间戳转换为数值格式,再利用时间元组进行过滤。后者需要注意转换后的精度问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

假设存在以下数据,且time_stamp列的schema为TimeStamp

time_stampFeature
2019-07-22 00:00:00.044A
2019-07-22 00:00:00.056B
2019-07-22 00:00:01.090B
2019-07-22 00:00:01.099A
2019-07-22 00:00:02.233C
2019-07-22 00:00:02.455D
2019-07-22 00:00:02.673A

现在如果要过滤 2019-7-22 00:00:01点之后的数据,有两种方式:

  • 直接使用字符串日期进行过滤
  • 将timestamp列cast为数值格式,然后传入timetuple进行过滤

第一种方式比较直接,写成如下方式即可:

origin_df.filter("time_stamp > '2019-07-22 00:00:01'")

得到的结果为:

time_stampFeature
2019-07-22 00:00:01.090B
2019-07-22 00:00:01.099A
2019-07-22 00:00:02.233C
2019-07-22 00:00:02.455D
2019-07-22 00:00:02.673A

第二种方式有点小坑,一般的文档会推荐写成:

import datetime
a = datetime.datetime(2019,7,22,0,0,1).timestamp()
origin_df.filter(col("time_stamp").cast("long“) > a)

此时的结果为:

time_stampFeature
2019-07-22 00:00:02.233C
2019-07-22 00:00:02.455D
2019-07-22 00:00:02.673A

你会发现数据变少了,原因就是通过cast(”long“)进行timestamp的转换时,数据只到秒级别,毫秒数据会被丢失,所以正确的方式应该是:

import datetime
a = datetime.datetime(2019,7,22,0,0,1).timestamp()
origin_df.filter(col("time_stamp").cast("double“) > a)

特此记录。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值