[英]How to convert multiple columns i.e time ,year,month and date into datetime format in pyspark dataframe
數據框有 4 列年、月、日、hhmm
hhmm - 小時和分鍾連接,例如:10:30 等於 1030
dd=spark.createDataFrame([(2019,2,13,1030),(2018,2,14,1000),(2029,12,13,0300)],["Year","month","date","hhmm"])
dd.collect()
pyspark 數據幀 dd 中日期時間格式的預期輸出
dd.collect()
2019-02-13 10:30:00
2018-2-14 10:00:00
2019-12-13 03:00:00
您的數據有問題,0300 整數不會作為所需格式加載,對我來說它加載為 192,所以首先您必須將其加載為字符串,您只需要在加載時使用架構分配數據類型。 請參閱文檔。 例如對於 .csv:
from pyspark.sql import DataFrameReader
from pyspark.sql.types import *
schema = StructType([StructField("Year", StringType(), True), StructField("month", StringType(), True), StructField("date", StringType(), True), StructField("hhmm", StringType(), True)])
dd = DataFrameReader.csv(path='your/data/path', schema=schema)
之后,您需要修復數據格式並將其轉換為時間戳:
from pyspark.sql import functions as F
dd = spark.createDataFrame([('2019','2','13','1030'),('2018','2','14','1000'),('2029','12','13','300')],["Year","month","date","hhmm"])
dd = (dd.withColumn('month', F.when(F.length(F.col('month')) == 1, F.concat(F.lit('0'), F.col('month'))).otherwise(F.col('month')))
.withColumn('date', F.when(F.length(F.col('date')) == 1, F.concat(F.lit('0'), F.col('date'))).otherwise(F.col('date')))
.withColumn('hhmm', F.when(F.length(F.col('hhmm')) == 1, F.concat(F.lit('000'), F.col('hhmm')))
.when(F.length(F.col('hhmm')) == 2, F.concat(F.lit('00'), F.col('hhmm')))
.when(F.length(F.col('hhmm')) == 3, F.concat(F.lit('0'), F.col('hhmm')))
.otherwise(F.col('hhmm')))
.withColumn('time', F.to_timestamp(F.concat(*dd.columns), format='yyyyMMddHHmm'))
)
dd.show()
+----+-----+----+----+-------------------+
|Year|month|date|hhmm| time|
+----+-----+----+----+-------------------+
|2019| 02| 13|1030|2019-02-13 10:30:00|
|2018| 02| 14|1000|2018-02-14 10:00:00|
|2029| 12| 13|0300|2029-12-13 03:00:00|
+----+-----+----+----+-------------------+
對於 Spark 3+,您可以使用make_timestamp
函數:
from pyspark.sql import functions as F
dd = dd.withColumn(
"time",
F.expr("make_timestamp(Year, month, date, substr(hhmm,1,2), substr(hhmm,3,2), 0)")
)
dd.show(truncate=False)
#+----+-----+----+----+-------------------+
#|Year|month|date|hhmm|time |
#+----+-----+----+----+-------------------+
#|2019|2 |13 |1030|2019-02-13 10:30:00|
#|2018|2 |14 |1000|2018-02-14 10:00:00|
#|2029|12 |13 |0300|2029-12-13 03:00:00|
#+----+-----+----+----+-------------------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.