如何将 'ndarray' 列数据类型从 '<M8[us]' 转换为字符串?

How to convert an 'ndarray' column dtype from '<M8[us]' to a string?

我已经尝试了很多东西,但似乎无法让它工作。本质上,我想这样做是因为在尝试将此 ndarray 转换为 DataFrame 时发生错误。在 Dataframe 中查找缺失的 Datetime64 值时发生以下错误:

"Out of bounds nanosecond timestamp: 1-01-01 00:00:00"

因此我希望将这些 DateTime64 列转换为字符串并在 ndarray 中重新编码 '1-01-01 00:00:00',然后将它们转换回 DataFrame 中的 DateTime 变量以避免遇到错误如上所示。

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

打印:

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

首先请检查您的 post 是否有效,即包含可运行代码。 您的示例 returns 一个语法错误,您尝试解释的代码根本不存在。


不过,我假设你的数据看起来像

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

看起来像

一样转换为数据框
df = pd.DataFrame(arr, columns=['ID', 'value', 'date'])

#                                         ID  ...                        date
# 0  b'61D8894E-7FB0-3DE6-E053-6C04A8C01207'  ...  2019-08-05T00:00:00.000000
# 1  b'61D8894E-7FB0-3DE6-E053-6C04A8C01207'  ...  2019-08-05T00:00:00.000000
# 2  b'61D8894E-7FB0-3DE6-E053-6C04A8C01207'  ...  0001-01-01T00:00:00.000000

那么您将日期字符串转换为日期时间对象的尝试可能是

df.date = pd.to_datetime(df.date)

# OutOfBoundsDatetime: Out of bounds nanosecond timestamp: 1-01-01 00:00:00

这会导致您 post 在您的问题中输入错误消息。

您可以使用 pd.to_datetimeerrors kwarg 捕获这些解析错误:

df.date = pd.to_datetime(df.date, 'coerce')

#                                         ID     value       date
# 0  b'61D8894E-7FB0-3DE6-E053-6C04A8C01207'  250000.0 2019-08-05
# 1  b'61D8894E-7FB0-3DE6-E053-6C04A8C01207'  250000.0 2019-08-05
# 2  b'61D8894E-7FB0-3DE6-E053-6C04A8C01207'  250000.0        NaT