代码之家  ›  专栏  ›  技术社区  ›  User12345

将日光节约时间字符串转换为时间戳会产生错误的结果

  •  3
  • User12345  · 技术社区  · 6 年前

    我有一个 pyspark 数据框。在此数据框中,我有一列称为 test_time 其中 string 数据类型

    >>> df
    DataFrame[test_time: string]
    

    df.show()

    +-------------------+
    |          test_time|
    +-------------------+
    |2017-03-12 02:41:06|
    |2017-03-12 02:43:52|
    |2017-03-12 02:56:32|
    |2017-03-12 03:16:23|
    |2017-03-12 03:17:15|
    |2017-03-12 03:22:19|
    |2017-03-12 03:52:19|
    |2017-03-12 04:03:21|
    +-------------------+
    

    现在我想转换这个 测试\u时间 列来自 一串 timestamp

    我已经做了如下工作

    from pyspark.sql import functions as F
    df1 = df.withColumn('convert_test', F.unix_timestamp('test_time', "yyyy-MM-dd hh:mm:ss").cast('timestamp'))
    
    >>> df1
    DataFrame[test_time: string, convert_test: timestamp]
    
    df1.show()
    
    +-------------------+--------------------+
    |          test_time|        convert_test|
    +-------------------+--------------------+
    |2017-03-12 02:41:06|2017-03-12 03:41:...|
    |2017-03-12 02:43:52|2017-03-12 03:43:...|
    |2017-03-12 02:56:32|2017-03-12 03:56:...|
    |2017-03-12 03:16:23|2017-03-12 03:16:...|
    |2017-03-12 03:17:15|2017-03-12 03:17:...|
    |2017-03-12 03:22:19|2017-03-12 03:22:...|
    |2017-03-12 03:52:19|2017-03-12 03:52:...|
    |2017-03-12 04:03:21|2017-03-12 04:03:...|
    +-------------------+--------------------+
    

    正如您所看到的 Hours 行不同 1-3 .

    FYI 我的时区是 PST 和行 1-3 计时是否在 day light savings 时间

    如何进行正确的转换。

    1 回复  |  直到 6 年前
        1
  •  0
  •   koiralo    6 年前

    我得到了正确的输出 unix_timestamp()

      val dataframe = Seq(
        ("2017-03-12 02:41:06"),
        ("2017-03-12 02:43:52"),
        ("2017-03-12 02:56:32"),
        ("2017-03-12 03:16:23"),
        ("2017-03-12 03:17:15"),
        ("2017-03-12 03:22:19"),
        ("2017-03-12 03:52:19"),
        ("2017-03-12 04:03:21")
      ).toDF("test_time")
    
     dataframe.withColumn("convert_test", unix_timestamp($"test_time", "yyyy-MM-dd hh:mm:ss").cast("timestamp")).show()
    

    输出:

    +-------------------+--------------------+
    |          test_time|        convert_test|
    +-------------------+--------------------+
    |2017-03-12 02:41:06|2017-03-12 02:41:...|
    |2017-03-12 02:43:52|2017-03-12 02:43:...|
    |2017-03-12 02:56:32|2017-03-12 02:56:...|
    |2017-03-12 03:16:23|2017-03-12 03:16:...|
    |2017-03-12 03:17:15|2017-03-12 03:17:...|
    |2017-03-12 03:22:19|2017-03-12 03:22:...|
    |2017-03-12 03:52:19|2017-03-12 03:52:...|
    |2017-03-12 04:03:21|2017-03-12 04:03:...|
    +-------------------+--------------------+
    

    如果您的时区不同,则可以使用以下函数 from_utc_timestamp() to_utc_timestamp() 转换时间戳。

    希望这是有帮助的!