我试图将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进行测试。)