"За пределами наносекундной метки времени"? Как избежать этой ошибки? - PullRequest
2 голосов
/ 08 октября 2019

У меня есть массив, распознаваемый как «объект numpy.ndarray», который печатает следующий вывод при выполнении следующего кода:

with sRW.SavReaderNp('C:/Users/Sam/Downloads/Data.sav') as reader:
record = reader.all()
print(record)

Вывод:

[(b'61D8894E-7FB0-3DE6-E053-6C04A8C01207', b'Sam', 250000., '2019-08-05T00:00:00.000000')
 (b'61D8894E-7FB0-3DE6-E053-6C04A8C01207', b'James',  250000., '2019-08-05T00:00:00.000000')
 (b'61D8894E-7FB0-3DE6-E053-6C04A8C01207', b'Mark', 250000., '0001-01-01T00:00:00.000000')

Я действительноЯ хочу обработать пустые переменные даты в панде DataFrame, используя формат pd.DataFrame, но когда я запускаю следующий код, появляется ошибка (как показано ниже):

SPSS_df = pd.DataFrame(record)

Ошибка: «Outметки наносекундной отметки времени: 1-01-01 00:00:00 "

Я прочитал исходный код документации модуля SavReader и в нем говорится, что если значение Datetime не найдено, выполните следующеедата назначена:

datetime.datetime(datetime.MINYEAR, 1, 1, 0, 0, 0)

Мне было интересно, как я могу обработать эту дату, не встретив этой ошибки, возможно, изменив / изменив этот код выше?

1 Ответ

0 голосов
/ 12 октября 2019

Что вы можете сделать, это прочитать все записи в виде строк (объект) и после преобразования столбца в требуемый тип (float и datetimes)

import numpy as np
import pandas as pd

record = [
    (
        b'61D8894E-7FB0-3DE6-E053-6C04A8C01207',
        b'Sam',
        250000.0,
        '2019-08-05T00:00:00.000000',
    ),
    (
        b'61D8894E-7FB0-3DE6-E053-6C04A8C01207',
        b'James',
        250000.0,
        '2019-08-05T00:00:00.000000',
    ),
    (
        b'61D8894E-7FB0-3DE6-E053-6C04A8C01207',
        b'Mark',
        250000.0,
        '0001-01-01T00:00:00.000000',
    ),
]

SPSS_df = pd.DataFrame(record, dtype=object).rename(
    {2: 'some_float', 3: 'dates'}, axis='columns'
).assign(
    some_float=lambda x: x['some_float'].astype(np.float),
    dates=lambda x: pd.to_datetime(x['dates'], errors='coerce'),
)

Это дает:

0  b'61D8894E-7FB0-3DE6-E053-6C04A8C01207'    b'Sam'    250000.0 2019-08-05
1  b'61D8894E-7FB0-3DE6-E053-6C04A8C01207'  b'James'    250000.0 2019-08-05
2  b'61D8894E-7FB0-3DE6-E053-6C04A8C01207'   b'Mark'    250000.0        NaT

и типы:

SPSS_df.dtypes
0                     object
1                     object
some_float           float64
dates         datetime64[ns]
...