提问者:小点点

Pyspark:从Datetime值中提取日期


我试图弄明白,如何使用PySparkSQL从datetime值中提取日期。

日期时间值如下所示:

DateTime
2018-05-21T00:00:00.000-04:00
2016-02-22T02:00:02.234-06:00

当我现在将其加载到spark数据框并尝试提取日期时(通过

Date() or
Timestamp() and then Date()

我总是得到一个错误,即需要一个日期或时间戳值,但提供了一个日期时间值。

有人能帮我从这个值中检索日期吗?我想,你需要为它提供一个时区——但是因为我已经在提取日期时遇到了问题,所以我首先想解决这个问题。

谢谢你和亲切的问候。


共2个答案

匿名用户

Pyspark有一个从时间戳中提取日期的to_date函数。在您的示例中,您可以通过执行以下操作创建一个只包含日期的新列:

df = df.withColumn("date_only", func.to_date(func.col("DateTime")))

如果要转换的列是字符串,则可以将格式参数设置为\u date以指定字符串的日期时间格式。

您可以在此处的文档中阅读更多关于迄今为止的

匿名用户

您可以使用date_format(或)from_unixtime(或)to_date函数从输入字符串中提取日期。

例子:

输入数据df数据如下...

#sample dataframe
df=spark.createDataFrame([('2018-05-21T00:00:00.000-04:00',),('2016-02-22T02:00:02.234-06:00',)],['ts'])

#set UTC timestamp
spark.sql("set spark.sql.session.timeZone=UTC")

df.show(10,False)
#+-----------------------------+
#|ts                           |
#+-----------------------------+
#|2018-05-21T00:00:00.000-04:00|
#|2016-02-22T02:00:02.234-06:00|
#+-----------------------------+

1.使用date\u format()函数:

from pyspark.sql.functions import *
df.select(date_format(col('ts'),"yyyy-MM-dd").alias('ts').cast("date")).show(10,False)
#+----------+
#|ts        |
#+----------+
#|2018-05-21|
#|2016-02-22|
#+----------+

2.使用to_date()函数:

df.select(to_date(col('ts')).alias('ts').cast("date")).show(10,False)
#+----------+
#|ts        |
#+----------+
#|2018-05-21|
#|2016-02-22|
#+----------+

3.使用来自unix的(unix\u timestamp())函数:

df.select(from_unixtime(unix_timestamp(col('ts'),"yyyy-MM-dd'T'HH:mm:ss.SSS"),"yyyy-MM-dd").alias("ts").cast("date")).show(10,False)
#+----------+
#|ts        |
#+----------+
#|2018-05-21|
#|2016-02-22|
#+----------+