从时间戳转换为pyspark中的特定日期

时间:2018-08-23 09:53:54

标签: pyspark type-conversion timestamp converter

我想在特定列上转换特定日期的时间戳。

这是我的输入内容:

+----------+
| timestamp|
+----------+
|1532383202|
+----------+

我期望的是:

+------------------+
|      date        |
+------------------+
|24/7/2018 1:00:00 |
+------------------+

如果可能的话,我想将分钟和秒设为0,即使它不是0。

例如,如果我有这个:

+------------------+
|      date        |
+------------------+
|24/7/2018 1:06:32 |
+------------------+

我想要这样:

+------------------+
|      date        |
+------------------+
|24/7/2018 1:00:00 |
+------------------+

我尝试的是:

from pyspark.sql.functions import unix_timestamp

table = table.withColumn(
    'timestamp',
    unix_timestamp(date_format('timestamp', 'yyyy-MM-dd HH:MM:SS'))
)

但是我有NULL。

2 个答案:

答案 0 :(得分:1)

也许您可以使用datetime库将时间戳转换为所需的格式。您还应该使用用户定义的函数来处理spark DF列。这就是我要做的:

# Import the libraries
from pyspark.sql.functions import udf
from datetime import datetime

# Create a function that returns the desired string from a timestamp 
def format_timestamp(ts):
    return datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:00:00')

# Create the UDF
format_timestamp_udf = udf(lambda x: format_timestamp(x))

# Finally, apply the function to each element of the 'timestamp' column
table = table.withColumn('timestamp', format_timestamp_udf(table['timestamp']))

希望这会有所帮助。

答案 1 :(得分:1)

更新

受@Tony Pellerin的回答启发,我意识到您可以直接使用:00:00,而不必使用regexp_replace()

table = table.withColumn("date", f.from_unixtime("timestamp", "dd/MM/yyyy HH:00:00"))
table.show()
#+----------+-------------------+
#| timestamp|               date|
#+----------+-------------------+
#|1532383202|23/07/2018 18:00:00|
#+----------+-------------------+

您的代码无效,因为pyspark.sql.functions.unix_timestamp()将:

  

使用默认时区和默认语言环境将具有给定模式的时间字符串(默认为'yyyy-MM-dd HH:mm:ss')转换为Unix时间戳(以秒为单位),如果失败则返回null。 / p>

您实际上想执行此操作的反过程,即convert from an integer timestamp to a string。为此,您可以使用pyspark.sql.functions.from_unixtime()

import pyspark.sql.functions as f

table = table.withColumn("date", f.from_unixtime("timestamp", "dd/MM/yyyy HH:MM:SS"))
table.show()
#+----------+-------------------+
#| timestamp|               date|
#+----------+-------------------+
#|1532383202|23/07/2018 18:07:00|
#+----------+-------------------+

现在date列是一个字符串:

table.printSchema()
#root
# |-- timestamp: long (nullable = true)
# |-- date: string (nullable = true)

因此您可以使用pyspark.sql.functions.regexp_replace()将分钟和秒设置为零:

table.withColumn("date", f.regexp_replace("date", ":\d{2}:\d{2}", ":00:00")).show()
#+----------+-------------------+
#| timestamp|               date|
#+----------+-------------------+
#|1532383202|23/07/2018 18:00:00|
#+----------+-------------------+

正则表达式模式":\d{2}"表示匹配文字:,后跟精确的2位数字。