将字符串时间转换为日期时间戳

时间:2019-06-17 01:36:16

标签: pyspark pyspark-sql

我刚刚开始为Pyspark工作,并且需要一些帮助来转换列数据类型。 我的数据框有一个字符串列,该列存储AM / PM中的一天中的时间,我需要将其转换为datetime以进行进一步的处理/分析。

fd = spark.createDataFrame([(['0143A'])], ['dt'])
fd.show()

+-----+
|   dt|
+-----+
|0143A|
+-----+

from pyspark.sql.functions import date_format, to_timestamp
#fd.select(date_format('dt','hhmma')).show()
fd.select(to_timestamp('dt','hhmmaa')).show()

+----------------------------+
|to_timestamp(`dt`, 'hhmmaa')|
+----------------------------+
|                        null|
+----------------------------+

Expected output: 01:43

在上述情况下如何获取正确的日期时间格式?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

如果我们查看to_timestamphttp://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.functions.to_timestamp)的文档,就会发现该格式必须指定为SimpleDateFormat(https://docs.oracle.com/javase/tutorial/i18n/format/simpleDateFormat.html)。

为了以AM / PM检索一天中的时间,我们必须使用hhmma。但是在SimpleDateFormat中,a捕获AMPM,而不捕获AP。因此,我们需要更改字符串:

import pyspark.sql.functions as F 
df = spark.createDataFrame([(['0143A'])], ['dt'])
df2 = df.withColumn('dt', F.concat(F.col('dt'), F.lit('M')))
df3 = df2.withColumn('ts', F.to_timestamp('dt','hhmma'))
df3.show()

+------+-------------------+
|    dt|                 ts|
+------+-------------------+
|0143AM|1970-01-01 01:43:00|
+------+-------------------+

如果要以您提到的格式将其作为字符串检索,则可以使用date_format

df4 = df3.withColumn('time', F.date_format(F.col('ts'), format='HH:mm'))
df4.show()

+------+-------------------+-----+
|    dt|                 ts| time|
+------+-------------------+-----+
|0143AM|1970-01-01 01:43:00|01:43|
+------+-------------------+-----+
相关问题