Целая дата от SPSS до даты Python - PullRequest
2 голосов
/ 07 июня 2019

У меня есть даты, импортированные из SPSS в Python через панд. Даты импортируются как целые числа (порядковые номера). Например, дата "2015-08-02" импортируется как 13657852800. Когда я пытаюсь

pd.to_datetime(13657852800, unit="s")
Traceback (most recent call last):

  File "<ipython-input-39-ae44044ad39e>", line 1, in <module>
    pd.to_datetime(13657852800, unit="s")

  File "/anaconda3/lib/python3.7/site-packages/pandas/core/tools/datetimes.py", line 611, in to_datetime
    result = convert_listlike(np.array([arg]), box, format)[0]

  File "/anaconda3/lib/python3.7/site-packages/pandas/core/tools/datetimes.py", line 203, in _convert_listlike_datetimes
    errors=errors)

  File "pandas/_libs/tslib.pyx", line 356, in pandas._libs.tslib.array_with_unit_to_datetime

OutOfBoundsDatetime: cannot convert input with unit 's'

Я также попробовал следующее после того, как узнал, что дата происхождения spss "1582-10-14"

pd.to_datetime(13657852800, unit="us", origin="1582-10-14")
Traceback (most recent call last):

  File "<ipython-input-38-a90cfe340ca5>", line 1, in <module>
    pd.to_datetime(13657852800, unit="us", origin="1582-10-14")

  File "/anaconda3/lib/python3.7/site-packages/pandas/core/tools/datetimes.py", line 571, in to_datetime
    arg = _adjust_to_origin(arg, origin, unit)

  File "/anaconda3/lib/python3.7/site-packages/pandas/core/tools/datetimes.py", line 379, in _adjust_to_origin
    "origin {origin} is Out of Bounds".format(origin=origin))

OutOfBoundsDatetime: origin 1582-10-14 is Out of Bounds

Как преобразовать порядковую целочисленную дату spss в фактическую дату в python с помощью функции to_datetime panda?

Ответы [ 2 ]

1 голос
/ 07 июня 2019

Через некоторое время я придумал решение этой проблемы. Для того чтобы источники SPSS и Python совпадали друг с другом, необходимо изменить масштаб целого числа из SPSS с номером 12219379200, т. Е. Числом секунд, существующим между "1582-10-14" и "1970-01-01" (источник используется to_datetime) * 1005. *

pd.to_datetime(13657852800-12219379200, unit="s")

Возвращает

Timestamp('2015-08-02 00:00:00')
0 голосов
/ 07 июня 2019

Проблема здесь в том, что у панд есть граница минимума и максимума для объекта даты и времени

pd.Timestamp.min
Out[349]: Timestamp('1677-09-21 00:12:43.145225')
pd.Timestamp.max
Out[350]: Timestamp('2262-04-11 23:47:16.854775807')

Но в SPSS я думаю, что мин будет в год 1582 и возможные пути решения этой проблемы

pd.to_datetime((13657852800/86400)-141428, unit='D')
Out[348]: Timestamp('2015-08-02 00:00:00')
...