带毫秒的pyspark todate函数

9nvpjoqh  于 2023-01-25  发布在  Spark
关注(0)|答案(2)|浏览(170)

我在pyspark中有一个 Dataframe ,其中包含time1和time2列,它们都显示为如下所示的字符串:

Time1                               Time2
1990-03-18 22:50:09.693159          2022-04-23 17:30:22-07:00
1990-03-19 22:57:09.433159          2022-04-23 16:11:12-06:00
1990-03-20 22:04:09.437359          2022-04-23 17:56:33-05:00

我正在尝试将这些转换为时间戳(最好是UTC)我正在尝试下面的代码:

Newtime1 = Function.to_timestamp(Function.col('time1'),'yyyy-MM-dd HH:mm:ss.SSSSSS')
Newtime2 = Function.to_timestamp(Function.col('time2'),'yyyy-MM-dd HH:mm:ss Z')

当应用于如下 Dataframe 时:

mydataframe = mydataframe.withColumn('time1',Newtime1)
mydataframe = mydataframe.withColumn('time2',Newtime2)

这将在数据中显示“None”。如何获得所需的时间戳?

jogvjijk

jogvjijk1#

时区的格式有点棘手。Read the docs carefully
1.* “模式字母的数量决定格式。"*
1.而且XxZ之间存在差异。
...

  • 偏移X和x:这将根据模式字母的数量设置偏移量的格式。一个字母只输出小时,如“+01”,除非分钟为非零,在这种情况下也会输出分钟,如“+0130”。两个字母输出小时和分钟,不带冒号,如“+0130”。三个字母输出小时和分钟,带冒号,如“+01:30”。四个字母输出小时和分钟以及可选秒,不带冒号,如“+013015”。五个字母输出小时和分钟以及可选秒,带冒号,如“+01:30:15”。六个或更多字母将失败。当要输出的偏移量为零时,模式字母" X“(大写)将输出”Z“,而模式字母" x"(小写)将输出”+00“、”+0000“或”+00:00“。
  • 偏移Z:这将根据模式字母的数量设置偏移量的格式。一个、两个或三个字母输出小时和分钟,不带冒号,例如“+0130”。当偏移量为零时,输出将为“+0000”。四个字母输出完整形式的本地化偏移量。相当于四个字母的Offset-O。如果偏移量为零,则输出为相应的本地化偏移量文本。五个字母输出小时、分钟,如果非零,则可选秒。如果偏移量为零,则输出“Z”。6个或更多的字母将失败。
>>> from pyspark.sql import functions as F
>>> 
>>> df = spark.createDataFrame([
...         ('1990-03-18 22:50:09.693159', '2022-04-23 17:30:22-07:00'),
...         ('1990-03-19 22:57:09.433159', '2022-04-23 16:11:12Z'),
...         ('1990-03-20 22:04:09.437359', '2022-04-23 17:56:33+00:00')
...     ],
...     ('time1', 'time2')
... )
>>> 
>>> df2 = (df
...     .withColumn('t1', F.to_timestamp(df.time1, 'yyyy-MM-dd HH:mm:ss.SSSSSS'))
...     .withColumn('t2_lower_xxx', F.to_timestamp(df.time2, 'yyyy-MM-dd HH:mm:ssxxx'))
...     .withColumn('t2_upper_XXX', F.to_timestamp(df.time2, 'yyyy-MM-dd HH:mm:ssXXX'))
...     .withColumn('t2_ZZZZZ', F.to_timestamp(df.time2, 'yyyy-MM-dd HH:mm:ssZZZZZ'))
... )
>>> 
>>> df2.select('time2', 't2_lower_xxx', 't2_upper_XXX', 't2_ZZZZZ', 'time1', 't1').show(truncate=False)
+-------------------------+-------------------+-------------------+-------------------+--------------------------+--------------------------+
|time2                    |t2_lower_xxx       |t2_upper_XXX       |t2_ZZZZZ           |time1                     |t1                        |
+-------------------------+-------------------+-------------------+-------------------+--------------------------+--------------------------+
|2022-04-23 17:30:22-07:00|2022-04-23 19:30:22|2022-04-23 19:30:22|2022-04-23 19:30:22|1990-03-18 22:50:09.693159|1990-03-18 22:50:09.693159|
|2022-04-23 16:11:12Z     |null               |2022-04-23 11:11:12|2022-04-23 11:11:12|1990-03-19 22:57:09.433159|1990-03-19 22:57:09.433159|
|2022-04-23 17:56:33+00:00|2022-04-23 12:56:33|2022-04-23 12:56:33|2022-04-23 12:56:33|1990-03-20 22:04:09.437359|1990-03-20 22:04:09.437359|
+-------------------------+-------------------+-------------------+-------------------+--------------------------+--------------------------+

>>>
l5tcr1uw

l5tcr1uw2#

对于col 'time2',模式如下所示:

yyyy-MM-dd HH:mm:ssxxx

在Pyspark v3.2.3中测试,在进行上述变更后,两者均正常工作。

相关问题