将 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',)]
将 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
:
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',)]