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