我刚刚开始为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
在上述情况下如何获取正确的日期时间格式?
感谢您的帮助!
答案 0 :(得分:2)
如果我们查看to_timestamp
(http://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
捕获AM
或PM
,而不捕获A
或P
。因此,我们需要更改字符串:
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|
+------+-------------------+-----+