如何将 '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_datetime
的 errors
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
我已经尝试了很多东西,但似乎无法让它工作。本质上,我想这样做是因为在尝试将此 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_datetime
的 errors
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