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

Posted

技术标签:

【中文标题】过滤pySpark数据框中的日期列记录【英文标题】:filter date column records in pySpark dataframe 【发布时间】:2020-01-30 19:24:04 【问题描述】:

我的输入数据采用以下格式,即 dataframe 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】:

您需要将该列转换为日期类型才能对其他日期列进行任何类型的检查。

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'))

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

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

【讨论】:

以上是关于过滤pySpark数据框中的日期列记录的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark Dataframe - 如何过滤掉另一个数据框中匹配的记录?

PySpark 中具有多列的日期算术

pyspark 将最小值添加回数据框

将重复记录合并到 pyspark 数据框中的单个记录中

如何通过 Pyspark 中同一数据框中另一列的正则表达式值过滤数据框中的一列

减去 Pandas 或 Pyspark 数据框中的连续列