pandas 0.14.1中sqlalchemy的python pandas parse_dates列通配符?

pandas 0.14.1中sqlalchemy的python pandas parse_dates列通配符?,python,pandas,dataframe,Python,Pandas,Dataframe,我正在使用sqlalchemy,它允许对最近发布的0.14.1版本的pandas进行sql查询 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/

我正在使用
sqlalchemy
,它允许对最近发布的0.14.1版本的pandas进行sql查询

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*'])

SQLite没有日期或日期时间类型。因此,datetime值存储为字符串,在获取查询时,它们也作为字符串返回。
但是这里有一些不同的选项来解决这个问题:

  • 使用
    read\u sql\u table
    而不是
    read\u sql\u query
    (如果您只需要执行“SELECT*FROM…”或某些列,并且不需要where子句)。这将使用表架构中的信息,并检测它是datetime列并转换它们(sqlalchemy执行此操作):

  • 使用sqlite连接时,可以指定
    sqlite3.PARSE_DECLTYPES
    (请参阅或此问题:):

    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()不是很好

  • 您可以在以后进行解析,以便在包含“Date”的所有列上自动执行此操作:

    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])
       ....:     
    
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])
   ....: