如何将PANDAS DATAFRAME列从Pandas DateTime64 [NS]转换为PYODBC SQL_TIM



我试图将pandas dataframe填充到 empty MS Access 2016 通过PYODBC。当我尝试将dataframes插入访问中时,我会收到以下错误消息: pyodbc.dataerror:'22008',[ODBC Microsoft Access驱动程序] DateTime Field field vired vellflow

研究表明,MS Access 日期/时间 datatypes对应于ODBC SQL_TIMESTAMP datatypes。

我尝试了以下内容将datetime64 [ns]转换为sql_timestamp:

import datetime
cursor.execute("INSERT sql statement...VALUES(?)", datetime.datetime(order_date))  

但是,我得到此错误: typeError:需要整数(获取type TimeStamp)。

为了成功将pandas/numpy的datetime64 [ns]值填充到访问表中,我需要做什么?我需要将它们转换为sql_timestamp吗?


编辑:我尝试在下面运行Gord Thompson的解决方案,并且遇到了此错误:

import datetime

dt = dt64_to_datetime(dt_ns)

>> AttributeError:'datetime' has no attribute 'utcfromtimestamp'

此错误背后的原因是什么?(在PYODBC 4.0.17,Python 3.6.2,MS Access 2016中进行了测试)

为了成功将pandas/numpy的datetime64 [ns]值填充到访问表中,我需要做什么?我需要将它们转换为sql_timestamp吗?

如这个出色的答案所示,您可能需要将numpy.datetime64值转换为Python datetime值,也许是这样:

def dt64_to_datetime(dt64):
    if np.isnat(dt64):
        return None
    else:
        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)

示例用法:

dt_ns = np.datetime64('2017-10-24 05:34:20.123456').astype('datetime64[ns]')
print(repr(dt_ns))  # numpy.datetime64('2017-10-24T05:34:20.123456000')
print(f'dt_ns.dtype: {dt_ns.dtype}')  # dt_ns.dtype: datetime64[ns]
dt = dt64_to_datetime(dt_ns)
print(repr(dt))  # datetime.datetime(2017, 10, 24, 5, 34, 20, 123456)
sql = "UPDATE tablename SET datetimefield = ? WHERE id=1"
params = (dt,)
crsr.execute(sql, params)

(用PyoDBC 4.0.21和Access 2010进行测试。)

相关内容

  • 没有找到相关文章

最新更新