【问题标题】:Error When Converting Pandas DataFrame with Dates to Spark Dataframe将带有日期的 Pandas DataFrame 转换为 Spark DataFrame 时出错
【发布时间】:2020-02-21 18:31:46
【问题描述】:

编辑:问题似乎在于标准日期时间库将日期时间转换为 Windows 中前纪元日期时间的时间戳

请参阅以下最小示例:

import datetime

#this works
datetime.datetime(1973,1,23,0).timestamp()

#this produces OSError: [Errno 22] Invalid argument
datetime.datetime(1953,1,23,0).timestamp()

问题

当我将带有 datetime64[ns] 日期的 Pandas 数据帧转换为 Apache Spark 数据帧时,我收到了一堆关于 Exception ignored in: 'pandas._libs.tslibs.tzconversion._tz_convert_tzlocal_utc' 的警告(下面​​是完整的堆栈跟踪),并且 pre-epoch 日期更改为时代。为什么会发生这种情况,我该如何预防?

软件版本

Windows 10 蟒蛇:3.7.6 pyspark 2.4.5 熊猫 1.0.1

重现代码

#imports
import pandas as pd
from datetime import datetime
from pyspark.sql import SparkSession

#set up spark
spark = SparkSession.builder.getOrCreate()

#create dataframe
df = pd.DataFrame({'Dates': [datetime(2019,3,29), datetime(1953,2,20)]})

#data types
df.dtypes

"""
Result:
Dates    datetime64[ns]
dtype: object
"""

#try to convert to spark
sparkdf = spark.createDataFrame(df)

堆栈跟踪

Exception ignored in: 'pandas._libs.tslibs.tzconversion._tz_convert_tzlocal_utc'
Traceback (most recent call last):
  File "C:\Users\jbishop\AppData\Roaming\Python\Python37\site-packages\dateutil\tz\_common.py", line 144, in fromutc
    return f(self, dt)
  File "C:\Users\jbishop\AppData\Roaming\Python\Python37\site-packages\dateutil\tz\_common.py", line 258, in fromutc
    dt_wall = self._fromutc(dt)
  File "C:\Users\jbishop\AppData\Roaming\Python\Python37\site-packages\dateutil\tz\_common.py", line 222, in _fromutc
    dtoff = dt.utcoffset()
  File "C:\Users\jbishop\AppData\Roaming\Python\Python37\site-packages\dateutil\tz\tz.py", line 222, in utcoffset
    if self._isdst(dt):
  File "C:\Users\jbishop\AppData\Roaming\Python\Python37\site-packages\dateutil\tz\tz.py", line 291, in _isdst
    dstval = self._naive_is_dst(dt)
  File "C:\Users\jbishop\AppData\Roaming\Python\Python37\site-packages\dateutil\tz\tz.py", line 260, in _naive_is_dst
    return time.localtime(timestamp + time.timezone).tm_isdst
OSError: [Errno 22] Invalid argument

结果数据框

sparkdf.show()
+-------------------+
|              Dates|
+-------------------+
|2019-03-29 00:00:00|
|1970-01-01 00:00:00|
+-------------------+

数据类型

sparkdf.printSchema()
root
 |-- Dates: timestamp (nullable = true)

【问题讨论】:

    标签: python python-3.x pandas date apache-spark


    【解决方案1】:

    这不是答案,但可以说明情况。甚至接近 1970 01 01 00:00 的日期也会给我 Errno 22。 (我希望解决一些非常早的纪元时间,以便在 NTP 时间可用之前记录数据。) 按预期工作的最早日期大约是 1970 01 01 17 00

    >>> import datetime
    >>> a3 = datetime.datetime(1970,1,1,17,59)
    >>> a1 = datetime.datetime(1970,1,1,17,0)
    >>> a0 = datetime.datetime(1970,1,1,16,59)
    >>> a3.timestamp()
    89940.0
    >>> a1.timestamp()
    86400.0
    >>> a0.timestamp()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    OSError: [Errno 22] Invalid argument
    >>>
    

    我的电脑在时区 MDT 或 GMT - 6(MST 夏令时)

    Python 新手和第一次回答作者! Windows 10。Python 3.7(64 位)。 Anaconda 就在附近,但这里没有使用。

    【讨论】:

      猜你喜欢
      • 2017-03-17
      • 2018-11-30
      • 2021-02-05
      • 1970-01-01
      • 2018-07-10
      • 2019-11-29
      • 2017-03-23
      • 1970-01-01
      • 2015-12-09
      相关资源
      最近更新 更多