2014-09-19 17 views
1

我使用的是sqlalchemy,它允許對最近發佈的0.14.1版本的熊貓進行SQL查詢。python pandas parse_dates在pandas 0.14.1中sqlalchemy的列通配符?

import pandas as pd 
from dateutil import parser 
from sqlalchemy import create_engine 
import datetime 

a=[['Datetime', 'Now Date', 'numbers', 'mixed'], ['1/2/2014', datetime.datetime.now(),6, 'z1'], ['1/3/2014', datetime.datetime.now(), 3, 'z1']] 
df = pd.DataFrame(a[1:],columns=a[0]) 
df['Datetime']=df['Datetime'].map(lambda x: parser.parse(x)) 

engine=create_engine('sqlite:///:memory:') 
df.to_sql('db_table',engine, index=False) 
df_new=pd.read_sql_query("SELECT * FROM db_table ",engine) 

>>> df.dtypes 
Datetime datetime64[ns] 
Now Date datetime64[ns] 
numbers    int64 
mixed    object 
dtype: object 

>>> df_new.dtypes 
Datetime object 
Now Date object 
numbers  int64 
mixed  object 
dtype: object 

正如你所看到的,餵養它進入發動機的時候我原來datetime格式丟失。但是,熊貓給你一種解析方法。

df_new=pd.read_sql_query("SELECT * FROM db_table ",engine, parse_dates=['Datetime','Now Date']) 

>>> df_new.dtypes 
Datetime datetime64[ns] 
Now Date datetime64[ns] 
numbers    int64 
mixed    object 
dtype: object 

問題的是我飼養不同種類的datetimes與不同的列名的引擎,我不能手動指定每個列名。我有太多的東西需要解析,而且它在不斷變化。我正在尋找一個解決方案,就像這樣:

df_new=pd.read_sql_query("SELECT * FROM db_table ",engine, parse_dates=['*Date*']) 

回答

1

SQLite沒有日期或日期時間類型。所以日期時間值作爲字符串存儲,當獲取查詢時,它們也以字符串形式返回。
但也有一些不同的選項這裏來處理這個:

  • 使用read_sql_table代替read_sql_query(如果你只需要執行「SELECT * FROM ...」或某些列,你需要沒有where子句)。這將使用信息表模式,並檢測它的datetime列,並將其轉換(SQLAlchemy的做到這一點):使用SQLite的連接時:

    In [13]: df_new2 = pd.read_sql_table("db_table",engine) 
    
    In [15]: df_new2.dtypes 
    Out[15]: 
    Datetime datetime64[ns] 
    Now Date datetime64[ns] 
    numbers    int64 
    mixed    object 
    dtype: object 
    
  • 您可以指定sqlite3.PARSE_DECLTYPESHow to read datetime back from sqlite as a datetime instead of string in Python?docs或這個問題) :

    In [33]: con = sqlite3.connect(':memory:', detect_types=sqlite3.PARSE_DECLTYPES) 
    In [34]: df.to_sql('db_table', con, index=False) 
    
    In [35]: df_new = pd.read_sql_query("SELECT * FROM db_table",con) 
    
    In [36]: df_new.dtypes 
    Out[36]: 
    Datetime datetime64[ns] 
    Now Date datetime64[ns] 
    numbers    int64 
    mixed    object 
    dtype: object 
    

    這似乎並不工作非常好的與SQLAlchemy的(http://docs.sqlalchemy.org/en/rel_0_9/dialects/sqlite.html#compatibility-with-sqlite3-native-date-and-datetime-types

  • 可以做到事後解析,要做到這一點自動在包含'日期'的所有列上:

    In [45]: date_cols = [col for col in df.columns if 'Date' in col] 
    
    In [47]: for col in date_cols: 
        ....:  df[col] = pd.to_datetime(df[col]) 
        ....: