【问题标题】:sqlalchemy.exc.StatementError: (builtins.TypeError) SQLite Date type only accepts Python date objects as inputsqlalchemy.exc.StatementError: (builtins.TypeError) SQLite Date 类型只接受 Python 日期对象作为输入
【发布时间】:2021-06-11 00:50:18
【问题描述】:

我有 pandas 数据框,其中包含 yyyy-mm 格式的月份和年份值。我正在使用pd.to_sql 设置数据类型值以将其发送到.db 文件。

我不断收到错误: sqlalchemy.exc.StatementError: (builtins.TypeError) SQLite Date type only accepts Python date objects as input.

有没有办法为 'MonthYear' (yyyy-mm) 列设置 'Date' 数据类型?还是应该在 VARCHAR 中设置?我尝试将其更改为不同类型的 pandas 的 datetime 数据类型,它们似乎都不起作用。

我对“full_date”没有任何问题,它可以正确分配。 pandas 中“full_date”的数据类型为datetime64[ns]

MonthYear full_date
2015-03   2012-03-11
2015-04   2013-08-19
2010-12   2012-06-29
2012-01   2018-01-01


df.to_sql('MY_TABLE', con=some_connection,
dtype={'MonthYear':sqlalchemy.types.Date(),
       'full_date':sqlalchemy.types.Date()})

【问题讨论】:

    标签: python-3.x pandas sqlalchemy


    【解决方案1】:

    我的意见是,当您可以从 'full_date' 列派生额外列时,您不应该在数据库中不必要地存储它。

    您会遇到的一个问题是 SQLite 没有 DATE 类型。因此,您需要使用查询解析提取日期。完整示例:

    import datetime as dt
    import numpy as np
    import pandas as pd
    import sqlite3
    
    # I'm using datetime64[ns] because that's what you say you have
    df = pd.DataFrame({'full_date': [np.datetime64('2012-03-11')]})
    
    con = sqlite3.connect(":memory:") 
    df.to_sql("MY_TABLE", con, index=False) 
    
    new_df = pd.read_sql_query("SELECT * FROM MY_TABLE;", con, 
                               parse_dates={'full_date':'%Y-%m-%d'})
    

    结果:

    In [111]: new_df['YearMonth'] = new_df['full_date'].dt.strftime('%Y-%m')
    
    In [112]: new_df
    Out[112]: 
       full_date YearMonth
    0 2012-03-11   2012-03
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-09
      • 1970-01-01
      • 1970-01-01
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      相关资源
      最近更新 更多