Преобразовать строку в дату ГГГГ-ММ

#python #apache-spark #pyspark #apache-spark-sql

Вопрос:

Я попытался преобразовать строку, подобную этой «2016-05», в фрейм данных pyspark в формат даты. Я знаю, как преобразовать эту строку «2016-05-01» в дату, но когда у меня есть только год и месяц, у меня ошибка. Вот мой df и мой код :

 df.withColumn("date",expr("substring(date, 1, 7)")).show()

 -------------------- ------- -------------------- -------------------- -------------------- 
|             journal|   date|               title|             content|              author|
 -------------------- ------- -------------------- -------------------- -------------------- 
|FirstList (Presco...|2016-05|Business For Sale...| Casual dining re...|                null|
|FirstList (Presco...|2016-05|Business For Sale...| Here you go... T...|                null|
 

Я использую функцию udf для преобразования столбца строки в дату :

 cast_to_date = udf(lambda x: datetime.strptime(x, '%Y-%m'), DateType())
df = df.withColumn('date', cast_to_date(col('date')))
df.show()
 

Но у меня есть эта ошибка :

     raise ValueError("unconverted data remains: %s" %
ValueError: unconverted data remains: -12
 

Я знаю, что это проблема с шаблоном даты, но я не знаю, почему. Может быть, у нас не может быть поля даты только с годом и месяцем ? Я смотрел некоторые темы об этом, но так и не нашел решения … Если у кого-то есть решение, спасибо за заранее !

Ответ №1:

Для этого вам не нужен UDF. Вы можете использовать to_date формат, включающий только год и месяц.

 import pyspark.sql.functions as F

df2 = df.withColumn("date", F.expr("to_date(substring(date, 1, 7), 'yyyy-MM')"))