Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.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 sql将unix时间转换为日期时间的结果不正确_Python_Unix Timestamp_Pyspark Sql - Fatal编程技术网

Python 使用Pyspark sql将unix时间转换为日期时间的结果不正确

Python 使用Pyspark sql将unix时间转换为日期时间的结果不正确,python,unix-timestamp,pyspark-sql,Python,Unix Timestamp,Pyspark Sql,我正在使用Pyspark将unix时间转换为可读的日期/时间字符串。我发现转换结果有时似乎不正确,特别是2017年12月31日。因此,我使用Python进行了双重检查: ut1 = 1514696352860 #python print('Use Python:', datetime.fromtimestamp(ut1/1000).strftime('%Y-%m-%d %H:%M:%S')) # pyspark time_df = spark.createDataFrame(pd.DataFr

我正在使用Pyspark将unix时间转换为可读的日期/时间字符串。我发现转换结果有时似乎不正确,特别是2017年12月31日。因此,我使用Python进行了双重检查:

ut1 = 1514696352860
#python
print('Use Python:', datetime.fromtimestamp(ut1/1000).strftime('%Y-%m-%d %H:%M:%S'))

# pyspark
time_df = spark.createDataFrame(pd.DataFrame({'unix_time': [ut1]}))
print('Use Pyspark:', time_df.withColumn('time', from_unixtime(time_df.unix_time/1000, 'YYYY-MM-dd HH:mm:ss'))\
                              .select('time').collect())
他们得到了相同的结果:

Use Python: 2017-12-30 23:59:12
Use Pyspark: [Row(time='2017-12-30 23:59:12')]
但是如果我加上,比如说,15分钟,那么是在2017年12月31日:

# add 15mins
ut2 = ut1 + 15*60*1000

# python
print(datetime.fromtimestamp(ut2/1000).strftime('%Y-%m-%d %H:%M:%S'))

# pyspark
time_df = spark.createDataFrame(pd.DataFrame({'unix_time': [ut2]}))
print('Use Pyspark:', 
      time_df.withColumn('time', from_unixtime(time_df.unix_time/1000, 'YYYY-MM-dd HH:mm:ss'))\
            .select('time').collect()
结果不同,Pyspark不正确(一年休假):

如果我添加24小时,使其在2018年1月1日生效,则结果再次相同(此处不再重复代码):

我的系统默认时区是EST时间,我认为python和pyspark都会转换为当前系统时区中的日期时间。我还使用Excel公式计算了((unixtime/1000/60/60/24)+日期(1970,1,1)-5/24),得到了与Python相同的结果

如果有人了解为什么会发生这种情况,以及如何在pyspark中修复它,我们将不胜感激。我的数据集有近5亿行,因此使用Pyspark非常理想。我可以尝试使用UDF而不是内置的unix_时间戳函数。但我们欢迎任何更好的解决方案

根据这一点:

这不是一个错误。您应该使用“yyy”而不是“yyy”

Use Python: 2017-12-31 00:14:12
Use Pyspark: [Row(time='2018-12-31 00:14:12')]
Use Python: 2018-01-01 00:14:12
Use Pyspark: [Row(time='2018-01-01 00:14:12')]
print(
    'Use Pyspark:', 
    time_df.withColumn(
        'time',
        from_unixtime(time_df.unix_time/1000, 'yyyy-MM-dd HH:mm:ss')
    ).select('time').collect()
)
#Use Pyspark: [Row(time='2017-12-31 00:14:12')]