Python 如何将Pandas DataFrame列从Pandas datetime64[ns]转换为Pyodbc SQL\u时间戳

Python 如何将Pandas DataFrame列从Pandas datetime64[ns]转换为Pyodbc SQL\u时间戳,python,dataframe,odbc,pyodbc,ms-access-2016,Python,Dataframe,Odbc,Pyodbc,Ms Access 2016,我正试图通过pyodbc将Pandas数据帧填充到空的MS Access 2016表中。尝试将数据帧插入Access时,我收到以下错误消息:pyodbc.dataerror:('22008',[ODBC Microsoft Access驱动程序]日期时间字段溢出 研究表明,MS-AccessDate/Time数据类型对应于ODBCSQL\u-TIMESTAMP数据类型 我尝试了以下方法将datetime64[ns]转换为SQL\u时间戳: import datetime cursor.execu

我正试图通过pyodbc将Pandas数据帧填充到空的MS Access 2016表中。尝试将数据帧插入Access时,我收到以下错误消息:pyodbc.dataerror:('22008',[ODBC Microsoft Access驱动程序]日期时间字段溢出

研究表明,MS-AccessDate/Time数据类型对应于ODBCSQL\u-TIMESTAMP数据类型

我尝试了以下方法将datetime64[ns]转换为SQL\u时间戳:

import datetime
cursor.execute("INSERT sql statement...VALUES(?)", datetime.datetime(order_date))  
但是,我得到了这个错误:TypeError:需要一个整数(得到了类型时间戳)。

要成功地将Pandas/Numpy的datetime64[ns]值填充到Access表中,我需要做什么?我需要将它们转换为SQL\u时间戳吗?如何转换?

编辑: 我尝试运行下面Gord Thompson的解决方案,但遇到了以下错误:

import datetime
dt=dt64到日期时间(dt\u ns)

>属性错误:'datetime'没有属性'utcfromtimestamp'

此错误背后的原因是什么?(在pyodbc 4.0.17、Python 3.6.2、MS Access 2016上测试)

要成功地将Pandas/Numpy的datetime64[ns]值填充到Access表中,我需要做什么?我需要将它们转换为SQL\u时间戳吗?如何转换

如中所示,您可能需要将
numpy.datetime64
值转换为Python
datetime
值,可能如下所示:

def dt64_to_datetime(dt64):
如果np.isnat(dt64):
一无所获
其他:
unix_epoch=np.datetime64(0,'s')
1秒=np.timedelta64(1,'s')
自新纪元起的秒数=(dt64-unix新纪元)/1秒
return datetime.utcfromtimestamp(自\u历元起的秒数)
用法示例:

dt_ns=np.datetime64('2017-10-24 05:34:20.123456').astype('datetime64[ns]”)
打印(报告日期)(numpy.datetime64('2017-10-24T05:34:20.123456000'))
打印(f'dt_ns.dtype:{dt_ns.dtype}')#dt_ns.dtype:datetime64[ns]
dt=dt64_到_日期时间(dt_ns)
打印(repr(dt))#datetime.datetime(2017,10,24,5,34,20,123456)
sql=“UPDATE tablename SET datetimefield=?其中id=1”
参数=(dt,)
crsr.execute(sql,参数)

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

@Gord Thompson-你知道Pandas/Numpy datetime64和datetime64[ns]值之间的区别吗?@Mook-我不知道,但在这种情况下,它似乎也没有什么区别。我已经更新了我的答案。@Gord Thompson-我对你的解决方案感到困惑。当我打印datetime64[ns]值,它看起来是这样的:2017-01-01。另外,我正试图使用SQL insert语句将Order_date列值插入Access中。@Mook-我也很困惑,因为
np.datetime64('2017-01-01').astype('datetime64[ns])
打印为
numpy.datetime64('2017-01-01T00:00:00.000000000')
,它也适用于更新(转换为
datetime
)后。@Gord Thompson-我更新了我的问题,试图澄清一些混淆。我试图将此Pandas列填充到一个空的访问表中。因此SQL UPDATE语句可能不起作用。请您的问题显示从
print(repr(order_date))
print(order_date.dtype)中获得的内容
。我使用了来自datetime import datetime的
。如果您只是
导入datetime
,那么您可能需要使用
datetime.datetime.utcfromtimestamp
@Gord Thompson-我遵循了您的解决方案,但我得到了以下错误:
OSError:[Errno 22]无效参数
。我认为这是因为输入值是
numpy.datetime64('NaT')
。我可以对NaT值做什么?