проблемы с панда данных вставки данных в MySQL с отметкой времени

0

У вас возникли проблемы с вставкой 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: дублирующееся имя в индексе/столбцах: не может вставить отметку времени, уже существует

Теги:
pandas
python-3.x
sqlalchemy

3 ответа

0
Лучший ответ

Как-то этот API с MySQL, похоже, не принимает отметки времени UTC.

Решения, которые работали на меня:

test['Timestamp']=test['Timestamp'].apply(lambda x:datetime.replace(x,tzinfo=None))
1

Если вы конвертируете тип данных Timestamp в datetime64[us] перед записью в БД, он должен работать:

test['Timestamp'] = test['Timestamp'].values.astype('datetime64[us]')
0

Мое решение состояло в том, чтобы преобразовать временную метку Pandas во всплывающее и затем в datetime, но вне DataFrame и непосредственно перед вставкой в базу данных с помощью:

datetime.fromtimestamp(value.timestamp())

Очень странно, что MySQL по умолчанию не может принимать отметку времени панд...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню