来自时间戳和国家/地区的 pyspark 时区转换

Posted

技术标签:

【中文标题】来自时间戳和国家/地区的 pyspark 时区转换【英文标题】:Timezone conversion with pyspark from timestamp and country 【发布时间】: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 中不起作用

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

谢谢

【问题讨论】:

【参考方案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>
>>> 

【讨论】:

以上是关于来自时间戳和国家/地区的 pyspark 时区转换的主要内容,如果未能解决你的问题,请参考以下文章

获取一个国家的默认时区(通过 CultureInfo)

地理 IP 和国家/地区/城市数据库

每个国家/地区是不是有“平均”时区?

在 Java 中将国家/地区代码转换为时区

获取iOS时区中的城市和国家/地区列表

如何使用js显示指定时区的时间