gpt4 book ai didi

Python:如果存在空值,如何将 Pyspark 列转换为日期类型

转载 作者:太空宇宙 更新时间:2023-11-03 14:05:47 24 4
gpt4 key购买 nike

在 pyspark 中,我有一个数据框,其中包含以字符串形式导入的日期。这些日期字符串列中有空值。我试图将这些列转换为日期类型列,但我不断收到错误。这是数据框的一个小例子:

+--------+----------+----------+
|DeviceId| Created| EventDate|
+--------+----------+----------+
| 1| null|2017-03-09|
| 1| null|2017-03-09|
| 1|2017-03-09|2017-03-09|
| 1|2017-03-15|2017-03-15|
| 1| null|2017-05-06|
| 1|2017-05-06|2017-05-06|
| 1| null| null|
+--------+----------+----------+

当没有空值时,我发现下面这段代码可以转换数据类型:

dt_func =  udf (lambda x: datetime.strptime(x, '%Y-%m-%d'), DateType())    
df = df.withColumn('Created', dt_func(col('Created')))

一旦我添加空值,它就会崩溃。我已尝试修改 udf 以说明空值,如下所示:

import numpy as np
def convertDatetime(x):
return sf.when(x.isNull(), 'null').otherwise(datetime.strptime(x, '%Y-%m-%d'))
dt_func = udf(convertDatetime, DateType())

我还尝试用任意日期字符串填充空值,将列转换为日期,然后尝试用空值替换任意填充日期,如下所示:

def dt_conv(df, cols, form = '%Y-%m-%d', temp_plug = '1900-01-01'):
df = df.na.fill(temp_plug)
dt_func = udf (lambda x: datetime.strptime(x, form), DateType())

for col_ in cols:
df = df.withColumn(col_, dt_func(col(col_)))
df = df.replace(datetime.strptime(temp_plug, form), 'null')
return df

但是,这个方法给我这个错误

ValueError: to_replace should be a float, int, long, string, list, tuple, or dict

谁能帮我解决这个问题?

最佳答案

试试这个 -

# Some data, I added empty strings and nulls both
data = [(1,'','2017-03-09'),(1,None,'2017-03-09'),(1,'2017-03-09','2017-03-09')]

df = spark.createDataFrame(data).toDF('id','Created','EventDate')
df.show()

:

+---+----------+----------+
| id| Created| EventDate|
+---+----------+----------+
| 1| |2017-03-09|
| 1| null|2017-03-09|
| 1|2017-03-09|2017-03-09|
+---+----------+----------+

:

df\
.withColumn('Created-formatted',when((df.Created.isNull() | (df.Created == '')) ,'0')\
.otherwise(unix_timestamp(df.Created,'yyyy-MM-dd')))\
.withColumn('EventDate-formatted',when((df.EventDate.isNull() | (df.EventDate == '')) ,'0')\
.otherwise(unix_timestamp(df.EventDate,'yyyy-MM-dd')))\
.drop('Created','EventDate')\
.show()

:

+---+-----------------+-------------------+
| id|Created-formatted|EventDate-formatted|
+---+-----------------+-------------------+
| 1| 0| 1489035600|
| 1| 0| 1489035600|
| 1| 1489035600| 1489035600|
+---+-----------------+-------------------+

我使用 unix_timestamp 返回 BigInt 格式,但您可以根据需要格式化这些列。

关于Python:如果存在空值,如何将 Pyspark 列转换为日期类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43595201/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com