【问题标题】:How to convert Numpy NaT values to Pandas datetime values如何将 Numpy NaT 值转换为 Pandas 日期时间值
【发布时间】:2018-05-20 20:32:00
【问题描述】:

我需要将 numpy.datetime64('NaT') 值转换为 Pandas datetime 值。我使用下面 Gord Thompson 的解决方案来转换 numpy.datetime64 值。

def dt64_to_datetime(dt64):
   unix_epoch = np.datetime64(0, 's')
   one_second = np.timedelta64(1, 's')
   seconds_since_epoch = (dt64 - unix_epoch) / one_second
   return datetime.utcfromtimestamp(seconds_since_epoch) 

示例用法:

for value in df[col].values: ##Convert each np.datetime64 value in DF column to Pandas datetime
    dt = dt64_to_datetime(value)  

当函数达到np.datetime64('NaT') 值时,会显示以下错误:OSError: [Errno 22] Invalid argument.

如何将 np.datetime64('NaT') 值转换为 Python datetime 值?


编辑/更新:

我正在尝试将 np.datetime64('NaT') 值转换为 Python datetime 值,因为研究表明这可以帮助我将 DataFrame 列中的值上传到 MS Access 表中。 我该怎么做?

【问题讨论】:

  • 它们不是 pandas 日期时间值,而是来自模块 datetime。问题是您为什么要首先进行转换,以及您打算如何处理下游代码中的缺失值(NaT = Not a Time)。
  • @Alexander - 我的意思是将 np.datetime64('NaT') 值转换为 Python datetime 值。我打算将 Dataframe 列中的值上传到 MS Access 表中。

标签: python python-3.x pandas numpy datetime


【解决方案1】:

添加到Alexander's 注释,最好显式处理空值。一种方法是像这样编辑您的函数:

import pandas as pd

def dt64_to_datetime(dt64):
    unix_epoch = np.datetime64(0, 's')
    one_second = np.timedelta64(1, 's')
    if pd.isnull(dt64):
        return pd.NaT
    else:
        seconds_since_epoch = (dt64 - unix_epoch) / one_second
        return datetime.utcfromtimestamp(seconds_since_epoch)

在我的环境中pd.isnull(numpy.datetime64('NaT')) 返回True。此外,我的环境实际上无法复制您的错误(它返回 nan 而不显式处理空值)。所以考虑升级 pandas 和/或 numpy。

【讨论】:

  • @Ido S - 谢谢你的评论。问题:我正在尝试将 pandas DataFrame 中的 NaT 值填充到 MS Access 表中。我怎么能做到这一点?
  • 不确定 -- 我不熟悉 MS Access。但是您可以使用其他东西而不是pd.NaT 来处理空值。例如,如果您只选择数字 0 或 -1(表示这是一个空值)。
【解决方案2】:

numpy.datetitme64('NaT') 似乎没有 datetime.datetime 模拟。 抓住错误,然后选择合适的东西。由于错误表明该值太大,因此返回可能的最大日期时间。

def dt64_to_datetime(dt64):
    unix_epoch = np.datetime64(0, 's')
    one_second = np.timedelta64(1, 's')
    seconds_since_epoch = (dt64 - unix_epoch) / one_second
    #print(seconds_since_epoch)
    try:
        v = datetime.datetime.utcfromtimestamp(seconds_since_epoch)
    except OSError as e:
        #print(e)
        v = datetime.datetime.max
    return v

【讨论】:

    猜你喜欢
    • 2022-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    相关资源
    最近更新 更多