SQL 查询结果将日期列报告为字符串,在日期数据类型中获取它时遇到问题

SQL query results reporting date column as a string, having issues getting it in a date datatype

我正在使用 pyodbc 从 SQL 服务器查询一些数据到 Python,并将结果存储在 pandas 数据帧中。结果列之一应该是日期数据类型,但它作为对象出现。我想弄清楚如何使用此专栏中的日期。

我能够将所有列转换为字符串和干净数据,能够成功将 quantity_picked 转换为浮点数,但无法成功将 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 服务器拉到 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)

在不将所有 3 列作为数据框中的一列的情况下让 pyodbc 引入数据时遇到问题,所以我将列引入并输入到单独的数据框中,然后合并它们。

这是数据的显示方式(清理后):

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)

非常感谢任何指导。谢谢。

所以我们有一个 SQL 服务器 table,其文本列包含 'yyyy-mm-dd' 日期值。如果我们简单地检索 as-is 列,这些值将作为字符串存储在 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),我们会得到时间戳值

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')