Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用pyspark从时间戳和国家/地区转换时区_Python_Apache Spark_Pyspark_User Defined Functions - Fatal编程技术网

Python 使用pyspark从时间戳和国家/地区转换时区

Python 使用pyspark从时间戳和国家/地区转换时区,python,apache-spark,pyspark,user-defined-functions,Python,Apache Spark,Pyspark,User Defined Functions,我正在尝试使用PySpark将UTC日期转换为具有本地时区(使用国家/地区)的日期。 我将国家作为字符串,日期作为时间戳 因此,输入是: date=Timestamp('2016-11-18 01:45:55')#类型为pandas。_libs.tslibs.Timestamp.Timestamp country=“FR”#类型为字符串 import pytz import pandas as pd def convert_date_spark(date, country): time

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

因此,输入是:

date=Timestamp('2016-11-18 01:45:55')#类型为pandas。_libs.tslibs.Timestamp.Timestamp

country=“FR”#类型为字符串

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中不起作用

你能帮我找到解决办法吗


谢谢

使用
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>
>>> 
时区名称=pytz.country\u时区(国家)[0] >>>时区名称 “欧洲/巴黎” >>>时区=pytz.timezone(时区名称) >>>时区 >>>