Результаты запроса SQL сообщают столбец даты в виде строки, из-за чего возникают проблемы с получением его в виде даты - PullRequest
1 голос
/ 18 июня 2019

Я запрашиваю некоторые данные из SQL Server в Python, используя pyodbc, и сохраняю результаты в фрейме данных pandas. Один из полученных столбцов должен быть типом данных date, но он переходит как объект. Я пытаюсь выяснить, как я могу работать с датами в этом столбце.

Мне удалось преобразовать все столбцы в строковые и чистые данные, я смог успешно преобразовать количество_популярных в число с плавающей запятой, но не смог успешно преобразовать столбец date_expected в datetime64 (как это предлагалось на других сайтах в сети) до ИЛИ после преобразования этого в строку.

Получена ошибка:

NameError: name 'datetime64' is not defined

Я также попытался просто преобразовать результаты, используя pd.to_datetime (), и я получаю ошибку ниже:

TypeError: <class 'pyodbc.Row'> is not convertible to datetime

У меня возникли проблемы с поиском какой-либо документации о том, как указать тип данных при выполнении запросов с использованием pyodbc.

Если я пропустил что-то очевидное, извините, я новый пользователь Python.

Я не уверен, стоит ли мне беспокоиться о получении этого с правильным типом данных во время запроса, после запроса и перед очисткой, или после очистки, или если это вообще возможно. Если это невозможно, приветствуется любое руководство о том, как обращаться с датами во время анализа в python.

Вот как я перетаскиваю данные из SQL Server в Python и помещаю их в фрейм данных:

cursor = sql_conn.cursor()
SQL_query1 = cursor.execute('SELECT item_number FROM [Data].[MCF].[FULL ORDER DETAIL]')

pratice_df = pd.DataFrame()

practice_df1 = pd.DataFrame(SQL_query1, columns=['item_number']) #imports all values from query as one column

SQL_query2 = cursor.execute('SELECT quantity_picked FROM [Data].[MCF].[FULL ORDER DETAIL]')
practice_df2 = pd.DataFrame(SQL_query2, columns=['quantity_picked'])

SQL_query3 = cursor.execute('SELECT date_expec FROM [Data].[MCF].[FULL ORDER DETAIL]')
practice_df3 = pd.DataFrame(SQL_query3, columns=['date_expected'])

#combine separate dataframes into one dataframe with corresponding values
practice_df = pd.concat([practice_df1, practice_df2, practice_df3], axis=1)

Не удалось заставить pyodbc перенести данные, не поместив все 3 столбца в один столбец в кадре данных, поэтому я перенес столбцы и ввел их в отдельные кадры, а затем объединил их.

Вот как отображаются данные (после очистки):

0      0001111041660              1.0    2019-05-27
1      0001111046070              2.0    2019-05-27

Если я сейчас введу practice_df.info (), я получу:

RangeIndex: 55676 entries, 0 to 55675
Data columns (total 3 columns):
item_number        55676 non-null object
quantity_picked    55676 non-null float64
date_expected      55676 non-null object
dtypes: float64(1), object(2)

Любое руководство очень ценится. Спасибо.

1 Ответ

0 голосов
/ 18 июня 2019

Итак, у нас есть таблица SQL Server с текстовым столбцом, содержащим значения даты «гггг-мм-дд».Если мы просто получим этот столбец как есть , эти значения будут сохранены в DataFrame в виде строк:

sql = """\
SELECT 
    item_number, 
    quantity_picked, 
    date_expec AS date_expected 
FROM [FULL ORDER DETAIL]"""

practice_df = pd.read_sql_query(sql, engine)

print(practice_df)
#      item_number  quantity_picked date_expected
# 0  0001111041660                1    2019-05-27
# 1  0001111046070                2    2019-05-27

sample_date = practice_df.at[0, 'date_expected']
print(type(sample_date))  # <class 'str'>
print(repr(sample_date))  # '2019-05-27'

Однако, если мы используем CAST(date_expec AS datetime2) в запросе, мы получаем значения Timestampвместо

sql = """\
SELECT 
    item_number, 
    quantity_picked, 
    CAST(date_expec AS datetime2) AS date_expected 
FROM [FULL ORDER DETAIL]"""

practice_df = pd.read_sql_query(sql, engine)

print(practice_df)
#      item_number  quantity_picked date_expected
# 0  0001111041660                1    2019-05-27
# 1  0001111046070                2    2019-05-27

sample_date = practice_df.at[0, 'date_expected']
print(type(sample_date))  # <class 'pandas._libs.tslibs.timestamps.Timestamp'>
print(repr(sample_date))  # Timestamp('2019-05-27 00:00:00')
...