在 sparklyr 中将 12 小时制转换为 24 小时制

Posted

技术标签:

【中文标题】在 sparklyr 中将 12 小时制转换为 24 小时制【英文标题】:convert 12 hour clock to 24 hour time in sparklyr 【发布时间】:2021-10-14 06:39:49 【问题描述】:

我正在尝试使用 sparklyr 将以下内容转换为 24 小时制:

2021-05-18 9:00:00 PM

我的预期结果:2021-05-18 21:00:00

我试过了:

data %>% 
  mutate(datetime_24 = to_timestamp("datetime_12", "yyyy-MM-dd hh:mm:ss"))

data %>% 
  mutate(datetime_24 = to_date("datetime_12", "yyyy-MM-dd hh:mm:ss"))

两者都导致 NULL。

我尝试了以下作为起点并得到了这个错误

data %>%
  mutate(datetime_24 = unix_timestamp(datetime_12, "yyyy-MM-dd hh:mm:ss"))

升级 Spark 3.0 可能会导致不同的结果:失败 在新解析器中解析“2021-05-18 9:00:00 PM”。你可以设置 spark.sql.legacy.timeParserPolicy 到 LEGACY 以恢复行为 在 Spark 3.0 之前,或设置为 CORRECTED 并将其视为无效 日期时间字符串。

我也在 pyspark 中尝试了以下操作,但遇到了类似的错误:

from pyspark.sql.functions import from_unixtime, unix_timestamp, col

df_time = spark.table("data")

df_time_new = df_time.withColumn('datetime_24', \
             from_unixtime(unix_timestamp(col(('datetime_12')), "yyyy-mm-dd hh:mm:ss"), "yyyy-mm-dd HH:mm:ss"))

错误:

升级 Spark 3.0 可能会导致不同的结果:失败 在新解析器中解析“2021-05-18 9:00:00 PM”。你可以设置 spark.sql.legacy.timeParserPolicy 到 LEGACY 以恢复行为 在 Spark 3.0 之前,或设置为 CORRECTED 并将其视为无效 日期时间字符串。引起:DateTimeParseException:文本'2021-05-18 9:00:00 PM' 无法在索引 11 处解析

【问题讨论】:

【参考方案1】:

您可以将 spark.sql.legacy.timeParserPolicy 设置为 LEGACY,如下所示:

spark.conf.set("spark.sql.legacy.timeParserPolicy","LEGACY")

在此之后,您在解析日期时间时应该不会收到错误。

由于 spark v3.0 (Read here) 中有一些与日期时间解析器相关的更改,因此您会收到该错误。

读取日期时间模式here。据此,您可以使用模式“a”进行 PM 或 AM 解析。

to_date("datetime_12", "yyyy-MM-dd hh:mm:ss a")

【讨论】:

谢谢,这可行,但您知道新 spark 3.0 的正确规范是什么吗? 已更新答案,请查收。

以上是关于在 sparklyr 中将 12 小时制转换为 24 小时制的主要内容,如果未能解决你的问题,请参考以下文章

JAVA:怎样把24小时制转换成12小时制

使用 sparklyr 在 R 中将字符串转换为逻辑字符串

php 24小时格式的日期转换为12小时的日期

时间转换

SimpleDateFormat 12小时制和24小时制的区别

用java写一个程序把24小时制的时间转换为12小时制的时间.具体说明内详