微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将带有空格后偏移量的字符串转换为 pyspark 时间戳?

如何解决如何将带有空格后偏移量的字符串转换为 pyspark 时间戳?

我有一个这样的 DF:

df = spark.createDataFrame(
    ["2003-01-01 02:00:00.0 -8:00"],"string"
).toDF('ts')
df.collect()
[Row(ts='2003-01-01 02:00:00.0 -8:00')]

我正在尝试从我的 ts 中创建时间戳类型,但我似乎无法使其正常工作。 我尝试了很多变体:

df = df.withColumn('cast',to_timestamp('ts','yyyy-MM-dd HH:mm:ss.S Z'))
df.collect()
[Row(ts='2003-01-01 02:00:00.0 -8:00',cast=None)]
df = df.withColumn('cast','yyyy-MM-dd HH:mm:ss.S X'))
df.collect()
[Row(ts='2003-01-01 02:00:00.0 -8:00','yyyy-MM-dd HH:mm:ss.S x'))
df.collect()
[Row(ts='2003-01-01 02:00:00.0 -8:00',to_timestamp('ts'))
df.collect()
[Row(ts='2003-01-01 02:00:00.0 -8:00',cast=None)]

但它不起作用。这是令人沮丧的,尤其是因为即使没有指定格式,也只是在偏移量工作之前删除空格..

df = spark.createDataFrame(
    ["2003-01-01 02:00:00.0-8:00"],"string"
).toDF('ts')
df = df.withColumn('cast',to_timestamp('ts'))
df.collect()
[Row(ts='2003-01-01 02:00:00.0-8:00',cast=datetime.datetime(2003,1,11,0))]

解决方法

您需要使用 ZZZZZ 而不是 Z。也适用于 xX

Spark SQL manual says

五个字母输出小时和分钟和可选的秒,带冒号,例如+01:30:15

解释其他选项的全文:

一个字母只输出小时,例如+01,除非分钟非零,在这种情况下也会输出分钟,例如+0130两个字母输出小时和分钟,没有冒号,例如+0130三个字母输出小时和分钟,带冒号,如+01:30四个字母 输出小时和分钟以及可选的秒,没有冒号,例如+013015五个字母输出小时和分钟以及可选的秒,带有冒号,例如+01:30:15六个或更多字母将失败

Spark SQL 示例:

SELECT to_timestamp('2003-01-01 02:00:00.1 -08:00','yyyy-MM-dd HH:mm:ss.S ZZZZZ')

返回

2003-01-01T10:00:00.100+0000

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。