使用pyspark 2.4.0
我在日期框架中有日期列,如下所示:
我需要将其转换为DD-MM-YYYY格式。我尝试了包括以下代码在内的一些解决方案,但它返回了空值,
df_students_2 = df_students.withColumn(
'new_date',
F.to_date(
F.unix_timestamp('dt', '%B %d, %Y').cast('timestamp')))
请注意,dt列中的日期类型不同。如果我可以将整个列仅以一种格式进行转换就更容易了,但是由于数据帧很大,因此无法遍历每一列并将其更改为一种格式。我还尝试了以下代码,仅针对将来的读者(包括我),针对我试图循环经过的两种日期类型,但均未成功。
def to_date_(col, formats=(datetime.strptime(col,"%B %d, %Y"), \
datetime.strptime(col,"%d %B %Y"), "null")):
return F.coalesce(*[F.to_date(col, f) for f in formats])
有什么想法吗?
答案 0 :(得分:0)
试试这个-
在scala中实现,但只需很少的更改即可完成pyspark
// I've put the example formats, but just replace this list with expected formats in the dt column
val dt_formats= Seq("dd-MMM-yyyy", "MMM-dd-yyyy", "yyyy-MM-dd","MM/dd/yy","dd-MM-yy","dd-MM-yyyy","yyyy/MM/dd","dd/MM/yyyy")
val newDF = df_students.withColumn("new_date", coalesce(dt_formats.map(fmt => to_date($"dt", fmt)):_*))
答案 1 :(得分:0)
尝试一下应该可以...
from pyspark.sql.functions import to_date
df = spark.createDataFrame([("Mar 25, 1991",), ("May 1, 2020",)],['date_str'])
df.select(to_date(df.date_str, 'MMM d, yyyy').alias('dt')).collect()
[Row(dt=datetime.date(1991, 3, 25)), Row(dt=datetime.date(2020, 5, 1))]