проблемы с панда данных вставки данных в MySQL с отметкой времени - PullRequest
0 голосов
/ 19 мая 2018

Проблемы с вставкой pandas dataframe в базу данных MySQL. Перечислил примеры данных и использованный код вместе с ошибками, которые следуют.Как вставить данные с 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: Невозможно привести DatetimeIndexto 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: повторяющееся имя в индексе / столбцах: невозможно вставить метку времени, уже существует

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

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

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

test['Timestamp']=test['Timestamp'].apply(lambda x:datetime.replace(x,tzinfo=None))
0 голосов
/ 08 декабря 2018

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

datetime.fromtimestamp(value.timestamp())

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

0 голосов
/ 22 мая 2018

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

test['Timestamp'] = test['Timestamp'].values.astype('datetime64[us]')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...