【问题标题】:Timezone conversion with pyspark from timestamp and country来自时间戳和国家/地区的 pyspark 时区转换
【发布时间】:2019-05-14 18:36:27
【问题描述】:

我正在尝试使用 PySpark 将 UTC 日期转换为具有本地时区(使用国家/地区)的日期。 我有国家作为字符串和日期作为时间戳

所以输入是:

date = Timestamp('2016-11-18 01:45:55') # type is pandas._libs.tslibs.timestamps.Timestamp

country = "FR" # Type is string

import pytz
import pandas as pd

def convert_date_spark(date, country):
    timezone = pytz.country_timezones(country)[0]

    local_time = date.replace(tzinfo = pytz.utc).astimezone(timezone)
    date, time = local_time.date(), local_time.time()

    return pd.Timestamp.combine(date, time)

# Then i'm creating an UDF to give it to spark

convert_date_udf = udf(lambda x, y : convert_date_spark(x, y), TimestampType())

然后我在提供 spark 的函数中使用它:

data = data.withColumn("date", convert_date_udf(data["date"], data["country"]))

我收到以下错误:

TypeError: tzinfo 参数必须为 None 或属于 tzinfo 子类,而不是类型 'str'

预期的输出是相同格式的日期

用 python 测试,_convert_date_spark_ 函数可以工作,但这在 pyspark 中不起作用

您能帮我找到解决方案吗?

谢谢

【问题讨论】:

    标签: python apache-spark pyspark user-defined-functions


    【解决方案1】:

    使用tzinfo 实例而不是string 作为时区。

    >>> timezone_name = pytz.country_timezones(country)[0]
    >>> timezone_name
    'Europe/Paris'
    >>> timezone = pytz.timezone(timezone_name)
    >>> timezone
    <DstTzInfo 'Europe/Paris' LMT+0:09:00 STD>
    >>> 
    

    【讨论】:

      猜你喜欢
      • 2022-12-18
      • 2015-11-22
      • 2018-10-13
      • 2012-03-08
      • 2011-12-20
      • 2019-05-29
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      相关资源
      最近更新 更多