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

标签 python unix-timestamp apache-spark-sql

我正在使用 Pyspark 将 UNIX 时间转换为可读的日期/时间字符串。我发现转换结果有时似乎不正确,特别是在 12/31/2017 上。所以我使用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不正确(一年了):

Use Python: 2017-12-31 00:14:12
Use Pyspark: [Row(time='2018-12-31 00:14:12')]

如果我添加 24 小时,使其成为 2018 年 1 月 1 日,结果又是相同的(此处不再重复代码):

Use Python: 2018-01-01 00:14:12
Use Pyspark: [Row(time='2018-01-01 00:14:12')]

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

如果有人知道为什么会发生这种情况以及如何在 pyspark 中修复它,请感激不尽。我的数据集有近 5 亿行,因此使用 Pyspark 是理想的选择。我可以尝试使用 UDF 而不是内置的 unix_timestamp 函数。但欢迎任何更好的解决方案!

最佳答案

根据这个JIRA ticket :

That is not a bug. You should use 'yyyy' instead of 'YYYY'.

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')]

关于python - 使用 Pyspark-sql 将 unix 时间转换为日期时间的结果不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48937372/

相关文章:

python - 删除字符串中包含两个或更少字母的所有单词,除了单词 "no"Python

python - 如何强制 scipy.optimize.fmin_l_bfgs_b 使用 'dtype=float32'

python - Python 中 NLTK 的命名实体识别。识别网元

python - python 中的简单代码导致意外行为

android - 如何从给定的 unix 时间戳获取到现在为止耗时

sql - 具有日期比较的Hive查询中的意外行为

apache-spark - 即使多行选项设置为 true,Spark 也不会在单个文件中加载所有多行 json 对象

c# - 优雅地检查给定日期是否是昨天

python - 在 pyspark 中查找正则表达式?

python - 合并月份和年份列以创建日期列