过滤pySpark数据框中的日期列记录

时间:2020-01-30 19:24:04

标签: pyspark pyspark-dataframes

我输入的数据采用以下格式,该格式为数据框 df_date

col1, col2, extraction_date, col3
010, DSL, 20191201235900, VDRAC
010, DSL, 20191203235900, VDRAC
010, DSL, 20191205235900, VDRAC
010, DSL, 20200120235900, VDRAC
010, DSL, 20200128235900, VDRAC
010, DSL, 20200129235900, VDRAC
010, DSL, 20200129235900, VDRAC
(string, string, bitint(longtype), string) # I have added the data type of each column for reference)

当我要处理旧日期时,仅考虑29号之前的记录。我需要过滤它并需要应用业务条件。

import datetime
var = '28-01-2020'
ref_date = datetime.datetime.strptime(var, '%d-%m-%Y').date()   #converting input ref date arg to date format
df_fil_date = df_data.filter(df_date.extraction_date.leq(ref_date))

向我显示错误,因为从源提取的日期为long_type(bitint),而ref_date变量为日期格式。

能否请您检查一下,并让我知道如何根据传递的日期变量过滤数据?

1 个答案:

答案 0 :(得分:1)

您需要将列强制转换为日期类型,以便对其他日期列进行各种检查。

clm_name = 'extraction_date'
input_format = 'yyyyMMddHHmmss'
outputformat = 'MM-dd-yyyy HH:mm:ss'
df_data = df_data.withColumn(clm_name, (unix_timestamp( df_data[extraction_date], input_format )))
df_data = df_data.withColumn(clm_name, from_unixtime( df_data[extraction_date], outputformat))
df_data = df_data.withColumn(clm_name, to_timestamp( df_data[clm_name], outputformat).cast('date'))

您可以使用'date'来代替强制转换为'timestamp',以便在强制转换期间不会丢失时间信息,但是再次,您将需要另一列的类型为'timestamp' 。 要过滤日期,

var = '2020-01-28'
df_fil_date = df_data.filter(df_date.extraction_date < lit(var).cast('date'))