pyspark 在Spark Dataframe 中将时间戳转换为日期

aiqt4smr  于 2023-05-28  发布在  Spark
关注(0)|答案(8)|浏览(275)

我看到了(这里:How to convert Timestamp to Date format in DataFrame?)在datetype中转换时间戳的方法,但是,至少对我来说,它不起作用。
以下是我尝试过的:

# Create dataframe
df_test = spark.createDataFrame([('20170809',), ('20171007',)], ['date',])

# Convert to timestamp
df_test2 = df_test.withColumn('timestamp',func.when((df_test.date.isNull() | (df_test.date == '')) , '0')\
.otherwise(func.unix_timestamp(df_test.date,'yyyyMMdd')))\

# Convert timestamp to date again
df_test2.withColumn('date_again', df_test2['timestamp'].cast(stypes.DateType())).show()

但这在列date_again中返回null:

+--------+----------+----------+
|    date| timestamp|date_again|
+--------+----------+----------+
|20170809|1502229600|      null|
|20171007|1507327200|      null|
+--------+----------+----------+

你知道什么失败了吗?

iq0todco

iq0todco1#

如下:

func.when((df_test.date.isNull() | (df_test.date == '')) , '0')\
  .otherwise(func.unix_timestamp(df_test.date,'yyyyMMdd'))

不起作用,因为它的类型不一致-第一个子句返回string,而第二个子句返回bigint。因此,如果dataNOT NULL并且不为空,则它将始终返回NULL
它也是过时的- SQL函数是NULL和格式错误安全的。不需要额外的检查。

In [1]: spark.sql("SELECT unix_timestamp(NULL, 'yyyyMMdd')").show()
+----------------------------------------------+
|unix_timestamp(CAST(NULL AS STRING), yyyyMMdd)|
+----------------------------------------------+
|                                          null|
+----------------------------------------------+

In [2]: spark.sql("SELECT unix_timestamp('', 'yyyyMMdd')").show()
+--------------------------+
|unix_timestamp(, yyyyMMdd)|
+--------------------------+
|                      null|
+--------------------------+

在Spark 2.2或更高版本中不需要中间步骤:

from pyspark.sql.functions import to_date

to_date("date", "yyyyMMdd")
9nvpjoqh

9nvpjoqh2#

您应该执行以下操作

>>> df_test2.withColumn('date_again', func.from_unixtime('timestamp').cast(DateType())).show()
+--------+----------+----------+
|    date| timestamp|date_again|
+--------+----------+----------+
|20170809|1502216100|2017-08-09|
|20171007|1507313700|2017-10-07|
+--------+----------+----------+

schema是

>>> df_test2.withColumn('date_again', func.from_unixtime('timestamp').cast(DateType())).printSchema()
root
 |-- date: string (nullable = true)
 |-- timestamp: string (nullable = true)
 |-- date_again: date (nullable = true)
zzoitvuj

zzoitvuj3#

对于pyspark:

  • 假设 * 你有一个字段名:* 'DateTime'* 将日期 * 显示为日期和时间 *

df 中添加一个新字段,显示 'DateOnly' 列,如下所示:

from pyspark.sql.functions  import date_format
    df.withColumn("DateOnly", date_format('DateTime', "yyyyMMdd")).show()

这将在 df 中显示一个名为 DateOnly 的新列-日期为 yyyymmdd 格式

lvjbypge

lvjbypge4#

要将pyspark dataframe(df)中的unix_timestamp列(称为TIMESTMP)转换为Date类型:
下面是两个步骤(可能有更短的方法):

  • 从UNIX时间戳转换为timestamp
  • timestamp转换为Date

最初df.printShchema()显示:-- TIMESTMP: long (nullable = true)
使用spark.SQL实现转换如下:

df.registerTempTable("dfTbl")

dfNew= spark.sql("""
                     SELECT *, cast(TIMESTMP as Timestamp) as newTIMESTMP 
                     FROM dfTbl d
                  """)

dfNew.printSchema()

printSchema()将显示:

-- newTIMESTMP: timestamp (nullable = true)

最后将timestamp的类型转换为Date,如下所示:

from pyspark.sql.types import DateType
dfNew=dfNew.withColumn('actual_date', dfNew['newTIMESTMP'].cast(DateType()))
t2a7ltrp

t2a7ltrp5#

#udf to convert the ts to timestamp
get_timestamp = udf(lambda x : datetime.datetime.fromtimestamp(x/ 1000.0).strftime("%Y-%m-%d %H:%M:%S"))

#apply this udf in the dataframe with your timestamp
df_withdate = df.withColumn("datetime", get_timestamp(df.ts))
cgh8pdjw

cgh8pdjw6#

他们关闭了我的question作为这个的副本,所以我将复制并粘贴我的答案在这里(是一个副本,对吗?)
因为timestamp列的单位是毫秒,所以只需要将其转换为秒并将其转换为TimestampType,这应该可以做到:

from pyspark.sql.types import TimestampType
import pyspark.sql.functions as F

df.select( 
      (F.col("my_timestamp") / 1000).cast(TimestampType())
)
41ik7eoe

41ik7eoe7#

没有import TimestampType的选项:

import pyspark.sql.functions as F

F.from_unixtime(F.col('date_col') / 1000).cast('date')
bjg7j2ky

bjg7j2ky8#

您可以直接施放场:

df = df.withColumn('datetime', col('timestamp').cast(TimestampType()))

相关问题