gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:11:05 28 4
gpt4 key购买 nike

我正在使用 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 格式在输入引擎时丢失了。但是 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

问题是我将不同类型的日期时间输入到具有不同列名称的引擎中,我无法手动指定每个列名称。我有太多的东西要解析,而且它在不断变化。我正在寻找一个相当于这样的解决方案:

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

最佳答案

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

  • 使用read_sql_table而不是read_sql_query(如果您只需要执行“SELECT * FROM ...”或某些列,并且不需要where子句)。这将使用表模式中的信息并检测它是日期时间列并转换它们(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])
    ....:

关于pandas 0.14.1 中 sqlalchemy 的 python pandas parse_dates 列通配符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25927272/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com