背景
假设存在以下数据,且time_stamp列的schema为TimeStamp
time_stamp | Feature |
---|---|
2019-07-22 00:00:00.044 | A |
2019-07-22 00:00:00.056 | B |
2019-07-22 00:00:01.090 | B |
2019-07-22 00:00:01.099 | A |
2019-07-22 00:00:02.233 | C |
2019-07-22 00:00:02.455 | D |
2019-07-22 00:00:02.673 | A |
现在如果要过滤 2019-7-22 00:00:01点之后的数据,有两种方式:
- 直接使用字符串日期进行过滤
- 将timestamp列cast为数值格式,然后传入timetuple进行过滤
第一种方式比较直接,写成如下方式即可:
origin_df.filter("time_stamp > '2019-07-22 00:00:01'")
得到的结果为:
time_stamp | Feature |
---|---|
2019-07-22 00:00:01.090 | B |
2019-07-22 00:00:01.099 | A |
2019-07-22 00:00:02.233 | C |
2019-07-22 00:00:02.455 | D |
2019-07-22 00:00:02.673 | A |
第二种方式有点小坑,一般的文档会推荐写成:
import datetime
a = datetime.datetime(2019,7,22,0,0,1).timestamp()
origin_df.filter(col("time_stamp").cast("long“) > a)
此时的结果为:
time_stamp | Feature |
---|---|
2019-07-22 00:00:02.233 | C |
2019-07-22 00:00:02.455 | D |
2019-07-22 00:00:02.673 | A |
你会发现数据变少了,原因就是通过cast(”long“)进行timestamp的转换时,数据只到秒级别,毫秒数据会被丢失,所以正确的方式应该是:
import datetime
a = datetime.datetime(2019,7,22,0,0,1).timestamp()
origin_df.filter(col("time_stamp").cast("double“) > a)
特此记录。。