У вас возникли проблемы с вставкой pandas dataframe в MySQL db. Здесь перечислены примеры данных и кода, используемые вместе с последующими ошибками. Как вставить данные с помощью pandas dataframe в mysql?
Используемые пакеты
Pandas - 0.22.0
sqlalchemy - 1.2.1
Используемый фреймворк:
Out[135]:
P_ID S_ID Action Timestamp \
0 Harold 1 Extensions 2017-11-07 03:17:27.342295+00:00
1 Harold 1 Extensions 2017-11-07 03:17:27.447234+00:00
2 Harold 1 Extensions 2017-11-07 03:17:27.552406+00:00
3 Harold 1 Extensions 2017-11-07 03:17:27.657676+00:00
4 Harold 1 Extensions 2017-11-07 03:17:27.762737+00:00
Value
0 -0.096083
1 -0.003894
2 -0.004779
3 0.131210
4 0.161990
dtypes:
P_ID object
S_ID int64
Action object
Timestamp datetime64[ns, UTC]
Value float64
dtype: object
Следующие последующие фрагменты кода были использованы с последующими ошибками
Также pd.to_datetime() не оказал никакого эффекта.
Используемый код (1) без индекса
engine = create_engine('mysql+pymysql://xxxx:3306/xxxx')
test.to_sql(name='table1', con=engine, if_exists = 'append',index=False)
conn.close()
Ошибка :
ValueError: не может использовать DatetimeIndex для dtype datetime64 [us]
Используемый код (2) с индексированной колонкой времени
engine = create_engine('mysql+pymysql://xxxx:3306/xxxx')
test.to_sql(name='table1', con=engine, if_exists = 'append',index=True,
index_label='Timestamp',
dtype={'Timestamp':typeTIMESTAMP(timezone=True)})
conn.close()
Ошибка :
ValueError: дублирующееся имя в индексе/столбцах: не может вставить отметку времени, уже существует
Как-то этот API с MySQL, похоже, не принимает отметки времени UTC.
Решения, которые работали на меня:
test['Timestamp']=test['Timestamp'].apply(lambda x:datetime.replace(x,tzinfo=None))
Если вы конвертируете тип данных Timestamp
в datetime64[us]
перед записью в БД, он должен работать:
test['Timestamp'] = test['Timestamp'].values.astype('datetime64[us]')
Мое решение состояло в том, чтобы преобразовать временную метку Pandas во всплывающее и затем в datetime, но вне DataFrame и непосредственно перед вставкой в базу данных с помощью:
datetime.fromtimestamp(value.timestamp())
Очень странно, что MySQL по умолчанию не может принимать отметку времени панд...