如何将Numpy NaT值转换为Pandas datetime值

时间:2017-12-06 20:41:46

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

我需要将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表中。 我该怎么做?

2 个答案:

答案 0 :(得分:0)

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

$this->load->helper('url');
if(!isset($this->router->routes[uri_string()])){
    show_404(); // Or whatever you want ...
}

在我的环境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而不显式处理空值)。所以考虑升级熊猫和/或numpy。

答案 1 :(得分:0)

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