SQL查询结果将日期列报告为字符串,将日期列以日期数据类型获取时出现问题

时间:2019-06-18 14:31:10

标签: python sql-server pandas pyodbc

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

我能够将所有列都转换为字符串和干净数据,能够成功地将quantity_picked转换为浮点数,但是在将其转换为OR之前或之后无法成功地将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 :(得分:0)

因此,我们有一个SQL Server表,其中的文本列包含'yyyy-mm-dd'日期值。如果我们只是按原样检索列 ,则这些值将作为字符串存储在DataFrame中:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>

<div id="spacer_div" class="flx">Some Data</div>
<table>
  <tr><td>Dummy data</td><td class="dodlg">More data1</td></tr>
  <tr><td>Dummy data</td><td class="dodlg">More data2</td></tr>
  <tr><td>Dummy data</td><td class="dodlg">More data3</td></tr>
  <tr><td>Dummy data</td><td class="dodlg">More data4</td></tr>
  <tr><td>Dummy data</td><td class="dodlg">More data5</td></tr>
  <tr><td>Dummy data</td><td class="dodlg">More data6</td></tr>
  <tr><td>Dummy data</td><td class="dodlg">More data7</td></tr>
  <tr><td>Dummy data</td><td class="dodlg">More data8</td></tr>
  <tr><td>Dummy data</td><td class="dodlg">More data9</td></tr>
</table>
<div id="msg"></div>

但是,如果我们在查询中使用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)