【问题标题】:"Out of bounds nanosecond timestamp"? How do you avoid this error?“超出纳秒时间戳”?你如何避免这个错误?
【发布时间】:2019-10-08 06:55:16
【问题描述】:

我有一个数组,被识别为“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')

我真的很想使用 pd.DataFrame 格式处理 pandas DataFrame 中的空日期变量,但是当我运行以下代码时出现错误(如下代码所示):

SPSS_df = pd.DataFrame(record)

错误:“纳秒时间戳越界:1-01-01 00:00:00”

我已经阅读了 SavReader Module Documentation 的源代码,它说如果找不到 Datetime 值,则分配以下日期:

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

我想知道如何处理这个日期而不遇到这个错误,也许是更改/操作上面的代码?

【问题讨论】:

  • 为什么不将record 转换为pandas 数据框?
  • 因为出现错误。如果 SPSS 文件中缺少日期变量。所以我试图在将其转换为熊猫数据框之前对其进行更改
  • 你能试试这个吗?首先,import numpy as np,然后将读数改为:with sRW.SavReaderNp('C:/Users/Sam/Downloads/Data.sav', rawMode=False, recodeSysmisTo=np.nan) as reader:
  • 我试过了很遗憾没有用
  • 当日期丢失时,您能否发布输出的精确副本?记录是list 还是tuples

标签: python pandas multidimensional-array stringindexoutofbounds


【解决方案1】:

您可以做的是将所有记录作为字符串(对象)读取,然后将列转换为所需的类型(浮点数和日期时间)

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]

【讨论】:

  • 虽然这避免了我在缺少日期空间中没有“NAT”的错误。我有随机日期'1754-08-30 22:43:41.128654'
  • 你能给我一个缺少日期空间的例子吗?
  • 代替 dtype='object',dtype='str' 有效吗?我不知道为什么,它删除了 b' 前缀
  • str dtype 将所有数据转换为字符串。您之前的字符链以字节为单位。
猜你喜欢
  • 2021-05-25
  • 2017-02-15
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 2019-06-24
  • 2021-02-05
相关资源
最近更新 更多