如何将Pandas DataFrame列从Pandas datetime64 [ns]转换为Pyodbc SQL_Timestamp

时间:2017-12-04 23:42:51

标签: python dataframe odbc pyodbc ms-access-2016

我正在尝试通过pyodbc将Pandas Dataframe填充到 MS Access 2016 表中。当我尝试将Dataframes插入Access时出现以下错误消息: pyodbc.dataerror:('22008',[ODBC Microsoft Access Driver] Datetime字段溢出

研究表明,MS Access 日期/时间数据类型对应于ODBC SQL_TIMESTAMP 数据类型。

我尝试了以下命令将datetime64 [ns]转换为SQL_TIMESTAMP:

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

但是,我收到此错误: TypeError:需要一个整数(获取类型Timestamp)。

为了成功将Pandas / Numpy的datetime64 [ns]值填充到Access表中,我需要做什么?我是否需要将它们转换为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上测试)

1 个答案:

答案 0 :(得分:1)

  

为了成功将Pandas / Numpy的datetime64 [ns]值填充到Access表中,我需要做什么?我是否需要将它们转换为SQL_TIMESTAMP以及如何?

this excellent answer所示,您可能需要将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测试。)