преобразуйте строковый тип(ММ/дд/ГГГГ чч:мм:сс AM/PM) в формат даты в PySpark?

#pyspark

Вопрос:

У меня есть строка в формате 05/26/2021 11:31:56 для mat, и я хочу преобразовать ее в формат даты, например, 05-26-2021 в pyspark.

Я пробовал ниже, но он преобразует тип столбца в дату, но делает значения нулевыми.

 df = df.withColumn("columnname", F.to_date(df["columnname"], 'yyyy-MM-dd'))
 

еще один, который я пробовал, — это

 df = df.withColumn("columnname", df["columnname"].cast(DateType()))
 

Я также попробовал следующий метод

 df = df.withColumn(column.lower(), F.to_date(F.col(column.lower())).alias(column).cast("date"))
 

но в каждом методе мне удавалось преобразовать тип столбца в дату, но это делает значения нулевыми.

Любое предложение приветствуется

Комментарии:

1. использовать to_date(df['col'], 'MM/dd/yyyy hh:mm:ss a')

2. Эй @mck Я попробовал тот, который вы предлагаете, я столкнулся с той же проблемой, он изменяет тип данных столбца, но делает данные нулевыми.

3. являются ли исходные данные нулевыми? возможно, вы переписали его в своем коде

4. Нет, исходные данные содержат строковый тип, и я только преобразую их в формат даты, я не выполняю никаких других преобразований в своем коде.

Ответ №1:

 # Create data frame like below
df = spark.createDataFrame(
[("Test", "05/26/2021 11:31:56 AM")], 
("user_name", "login_date"))

# Import functions
from pyspark.sql import functions as f

# Create data framew with new column new_date with data in desired format
df1 = df.withColumn("new_date", f.from_unixtime(f.unix_timestamp("login_date",'MM/dd/yyyy hh:mm:ss a'),'yyyy-MM-dd').cast('date'))  
 

Комментарии:

1. Эй, это работает, я выполнял работу, как показано ниже df = df.С колонкой(столбец, F. unix_timestamp(столбец, «ММ/дд/ГГГГ чч:мм:сс аа»).приведение(«двойное»).приведение(«метка времени»)) df = df.С колонкой(столбец, F. from_utc_timestamp(столбец, «Z»).приведение(тип даты()))

2. Эй , я принял ваш ответ, Спасибо за помощь @user12345, я только говорил, что использовал два утверждения для достижения того, что вы сделали в одном, я использую ваше утверждение в коде. Еще раз спасибо

Ответ №2:

Приведенный выше ответ, опубликованный @User12345, работает, и приведенный ниже метод также работает

 df = df.withColumn(column, F.unix_timestamp(column, "MM/dd/YYYY hh:mm:ss aa").cast("double").cast("timestamp"))
df = df.withColumn(column, F.from_utc_timestamp(column, 'Z').cast(DateType()))