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')
我正在使用 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')