Python панд dtypes обнаружения от SQL

голоса
0

Я очень обеспокоен поведением панды DataFrame об обнаружении DTYPE.

Я использую «read_sql_query» для извлечения данных из базы данных для создания DataFrame, а затем сбросить его в файл CSV.

Мне не нужно какое-либо преобразование. Просто бросьте его в CSV-файл и дата изменения полей в форме: «% д /% м /% Y»

Однако :

self.dataframe.to_csv(self.fic,
                   index=False,
                   header=False,
                   sep='|',
                   mode='a',
                   encoding='utf-8',
                   line_terminator='\n',
                   date_format='%d/%m/%Y
                   )

упусти бы transforme / форматировать некоторые поля дат ...

Я пытался сделать это по-другому:

l = list(self.dataframe.select_dtypes(include=['datetime64']).columns)
for i in l:
    self.dataframe[i] = self.dataframe[i].dt.strftime('%d/%m/%Y')

Я должен был быть удовлетворен, но еще некоторые тесты показали странное поведение:

если мой запрос SQL выбирает только два nuplets:

requete = 'select * from DOMMAGE_INTERET where doi_id in (176433, 181564)'

Все работает, независимо верстка в формате CSV или в DataFrame.

Он определяет поля даты должным образом:

df.dtypes
doi_id                         int64
aff_id                         int64
pdo_id                         int64
doi_date_decision     datetime64[ns]
doi_date_mod          datetime64[ns]
doi_montant                  float64
doi_reste_a_payer             object
doi_appliquer_taux             int64
doi_date_update       datetime64[ns]
afg_id                         int64
dtype: object

Но при использовании другого выбора:

requete = 'select * from DOMMAGE_INTERET where rownum < 100'

Это пропустить еще раз. И на самом деле, типы полей обнаруживаются по-разному:

doi_id                         int64
aff_id                         int64
pdo_id                         int64
doi_date_decision             object
doi_date_mod          datetime64[ns]
doi_montant                  float64
doi_reste_a_payer             object
doi_appliquer_taux             int64
doi_date_update       datetime64[ns]
afg_id                         int64
dtype: object

Как вы можете видеть: тип «doi_date_decision» действительно изменяется в зависимости от выбора запроса , но, конечно, это тот же набор данных !!!

Разве это не странно?

У вас есть объяснение такого поведения?

Задан 02/09/2016 в 17:50
пользователем
На других языках...                            


3 ответов

голоса
1

Трудно вырыть Ваш вопрос без каких-либо образцов данных. Тем не менее, вы, вероятно, столкнуться с любым из двух случаев:

  • Некоторые из строк, выбранных в вашем втором случае содержат NULLзначения, которое останавливает панду интерпретировать автоматически вашу колонку как DateTime
  • У вас есть другой MDY конвенции в вашей базе данных и некоторые даты ниже тринадцатого месяца обрабатываются как даты, а другие нет, и хранятся в виде строк, пока не будут преобразованы вручную в DMY
Ответил 02/09/2016 в 20:36
источник пользователем

голоса
2

Ваша to-csvработа не преобразует все указанные поля даты , потому что , как вы говорите, не все столбцы DateTime считываются как формат даты и времени , но показывают , как строки ( объекта DTYPE) в текущем dataframe. Это неудачный побочный эффект чтения из внешних источников , как импортированной системы --this включает Python, SAS, Stata, R, Excel и т.д. .-- пытается определить столбцы , как правило , с помощью первых нескольких строк , если иное не указано явно.

К счастью, панды - х read_sql_query()поддерживает параметр для parse_dates. Таким образом , рассмотреть вопрос об определении даты во время чтения в операции , как этот аргумент принимает список или словарь:

df = read_sql_query('select * from DOMMAGE_INTERET where rownum < 100', engine, 
                    parse_dates = ['doi_date_decision', 'doi_date_mod', 'doi_date_update'])

В качестве альтернативы, преобразовать с pd.to_datetime()только после считывания и до to_csv:

df['doi_date_decision'] = pd.to_datetime(df['doi_date_decision'])

И большинство RDMS поддерживает DateTime в YYYY-MM-DD HH:MM:SSформате, совмещая в панду формат.

Ответил 04/09/2016 в 02:49
источник пользователем

голоса
0

Благодаря Boud и Парфе. Их ответы правы:

Все мои тесты показывают, что недостающие поля даты можно сделать DTYPE обнаружения на провал.

read_sql_query () имеет параметр для определения полей с типом даты. Я думаю, чтобы вылечить эту проблему.

К сожалению, так как в настоящее время, я использую полное родовое лечение обработать сотни таблиц. Для того, чтобы использовать «read_sql_query» параметр «parse_dates» бы предполагаешь сделать предварительную работу определения метаданных (например, в формате JSON файл, описывающем каждую таблицу).

На самом деле, я также узнал, что целые числа изменяются, чтобы плавать, когда есть NaN поле в колонке ...

Если бы я читать CSV плоские файлы, я мог понять, что тип данных может быть трудно обнаружить ... но из базы данных (read_sql_query)! Панды имеют SqlAlchelmy как зависимость. И SQLAlchemy (и даже немного ниже драйвер базы данных уровня Python (cx_Oracle, DB API)) имеет механизм отражения для обнаружения типов данных. Панды могли бы использовать эти метаданные, чтобы сохранить целостность типов данных.

Ответил 06/09/2016 в 14:51
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more