我正在使用sqlalchemy
允许sql查询最近发布的0.14.1版本的pandas。
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
格式输入引擎时会丢失。但是pandas为你提供了一种通过解析来恢复它的方法。
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*'])
答案 0 :(得分:1)
SQLite没有日期或日期时间类型。因此,datetime值存储为字符串,在获取查询时,它们也会以字符串形式返回 但是这里有一些不同的选项来处理这个问题:
使用read_sql_table
代替read_sql_query
(如果您只需要执行" SELECT * FROM ..."或某些列,并且您不需要where子句)。这将使用表模式中的信息并检测它是datetime列并转换它们(sqlalchemy执行此操作):
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
使用sqlite连接时,您可以指定sqlite3.PARSE_DECLTYPES
(请参阅docs或此问题:How to read datetime back from sqlite as a datetime instead of string in Python?):
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])
....: