问题描述
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
。也适用于 x
和 X
:
五个字母输出小时和分钟和可选的秒,带冒号,例如+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