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

标签 python sql-server pandas pyodbc

我正在使用 pyodbc 将 SQL Server 中的一些数据查询到 Python 中,并将结果存储在 pandas 数据框中。结果列之一应该是日期数据类型,但它作为对象出现。我正在尝试弄清楚如何处理本栏中的日期。

我能够将所有列转换为字符串和干净数据,能够成功将Quantity_picked转换为 float ,但在转换之前或之后无法成功将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)

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

最佳答案

因此,我们有一个 SQL Server 表,其中的文本列包含“yyyy-mm-dd”日期值。如果我们只是按原样检索该列,那么这些值将作为字符串存储在 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')

关于python - SQL 查询结果将日期列报告为字符串,但在获取日期数据类型时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56651474/

相关文章:

python - pyodbc 和 sql server,将 datetime.date 应用于 DATE 列

sql-server - 使用位掩码存储不相关的位列

python - 从 pandas 数据框中进行多线绘图时,绘图没有实线

python - Pyramid 和 pyramid_simple 中的 Formencode 来自 : set fixed locale

python - 在我的 Qt GUI 中包含外部小部件 [python]

sql - SQL Server 2008 可以水平扩展吗?

python - ks_2samp 返回 p 值 1.0

python - Plyer 通知在 android 上不起作用

python - 有人可以解释一下这段代码是错误的吗?

python - 减少 pandas DataFrame 中的列数