将 pandas 数据帧写入 MSSQL datetimeoffset 列时缺少时区偏移量

missing timezone offset when writing pandas dataframe to MSSQL datetimeoffset column

将 pandas 数据帧写入 MSSQL 数据库上的 table 时,时间戳条目的时区偏移设置为 +00:00,尽管数据帧中的时间戳包含 CE (S)T 偏移 +02:00。

我正在创建一个包含三列的简单 table,其中一列包含日期时间时区感知时间戳。在 SQL 服务器上创建 table 时,所述列数据类型设置为 datetimeoffset(7)。

name = ['price']*24
values = np.random.rand(24)
starttimes = pd.date_range('2019-09-10 00:00', '2019-09-10 23:00', freq='h', tz='CET')

df = pd.DataFrame({'start_time': starttimes, 'values': values, 'item': name})

engine = sqlalchemy.create_engine('mssql+pymssql://scott:tiger@hostname:port/dbname')

df.to_sql(
    name='test_table',
    con=engine,
    index=False,
    if_exists='append',
    dtype={'start_time': DateTime(timezone=True)}
)

当数据帧被插入到数据库中的 table 时,偏移量变为 +00:00 而不是 +02:00。 例如,原始数据框有一个条目 2019-09-10 00:00:00+02:00 在服务器上变成 2019-09-10 00:00:00.0000000 +00:00

当我使用 pyodbc 代替我安装了 Microsoft ODBC Driver 17 的 pymssql 时,问题仍然存在。

我不确定 pymssql,但是如果使用 df.astype:

将 DataFrame 列转换为字符串,您可以使用 pyodbc 插入到 datetimeoffset
table_name = "test_table"
with engine.begin() as conn:
    conn.exec_driver_sql(f"DROP TABLE [{table_name}]")
    conn.exec_driver_sql(f"CREATE TABLE [{table_name}] (dto datetimeoffset(7))")

dto = datetime.datetime(2019, 9, 10, 0, 0, 0, tzinfo=datetime.timezone(datetime.timedelta(hours=2)))
df = pd.DataFrame([(dto,)], columns=['dto'])

# convert pandas Timestamp column to string
df = df.astype({'dto': numpy.str})

df.to_sql(table_name, engine, if_exists='append', index=False)

# check result
with engine.begin() as conn:
    print(conn.execute(text(f"SELECT CAST(dto AS VARCHAR(50)) AS dto_str FROM [{table_name}]")).fetchall())
    # [('2019-09-10 00:00:00.0000000 +02:00',)]