отсутствует смещение часового пояса при записи кадра данных pandas в MSSQL столбец datetimeoffset - PullRequest
1 голос
/ 30 сентября 2019

Смещение часового пояса установлено на +00: 00 для записей отметок времени при записи кадра данных pandas в таблицу базы данных MSSQL, хотя отметки времени в кадре данных содержат смещения CE (S) T +02: 00.

Я создаю простую таблицу с тремя столбцами, в одном из которых содержатся метки времени с учетом даты и времени. Указанный тип данных столбца был установлен в datetimeoffset (7), когда таблица была создана на сервере SQL.

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)}
)

Когда кадр данных вставляется в таблицу в базе данных, смещение становится +00: 00 вместо +02: 00. Например, исходный фрейм данных имеет запись 2019-09-10 00: 00: 00 + 02: 00, которая на сервере становится 2019-09-10 00: 00: 00.0000000 +00: 00

Проблемасохраняется, когда я использую pyodbc вместо pymssql, для которого у меня установлен драйвер Microsoft ODBC 17.

1 Ответ

0 голосов
/ 02 октября 2019

Я не уверен насчет pymssql, но с pyodbc вы можете вставить в столбец datetimeoffset, если преобразуете столбец DataFrame в строку, используя df.astype:

table_name = "test_table"
# drop table if exists
try:
    engine.execute(f"DROP TABLE [{table_name}]")
except sa.exc.ProgrammingError as pe:
    error_code = pe.orig.args[0]
    if error_code == '42S02':
        # table did not exist
        pass
    else:
        raise
except:
    raise

engine.execute(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
print(engine.execute(f"SELECT CAST(dto AS VARCHAR(50)) AS dto_str FROM [{table_name}]").fetchall())
# [('2019-09-10 00:00:00.0000000 +02:00',)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...