添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

我怎样才能导出到sqlite(或其他格式)并保留日期数据类型?

1 人关注

我有一个脚本,将CSV加载到一个pandas数据框架中,清理产生的表格(例如删除无效的值,将日期格式化为日期,等等),并将输出保存到本地的sqlite .db文件。

然后我有其他的脚本打开该数据库文件并对其进行其他操作。

我的问题是,Sqlite3没有一个明确的日期格式。 https://www.sqlite.org/datatype3.html 这意味着对日期的操作会失败,例如。

df_read['Months since mydate 2'] = (  pd.to_datetime('15-03-2019') - df_read['mydate'] )

returns

TypeError: 不支持-的操作数类型: 'Timestamp' 和 'str' 。

我怎样才能以一种保持跟踪所有数据类型的方式导出我的数据框架,包括日期?

我想到了以下几点。

  • 导出到另一种格式,但什么格式?如果有一个合适的SQL服务器就好了,但在这种情况下我没有权限。我需要一种明确声明每一列的数据类型的格式,所以CSV不是一个选项。

  • 有一个小函数,在从SQL lite中读取列后,将其重新转换为日期。但这意味着我必须手动跟踪列的日期--这在大数据集上是很麻烦和缓慢的。

  • 在SQL lite数据库中有另一个表,它记录了哪些列是日期,以及它们的格式(如%Y-%m-%d);这可以帮助重新转换为日期,但它仍然感觉非常麻烦,笨重,非常不象话。

  • 下面是一个快速的例子,说明我的意思。

    import numpy as np
    import pandas as pd
    import sqlite3
    num=int(10e3)
    df=pd.DataFrame()
    df['month'] = np.random.randint(1,13,num)
    df['year'] = np.random.randint(2000,2005,num)
    df['mydate'] = pd.to_datetime(df['year'] * 10000 + df['month']* 100 + df['month'], format ='%Y%m%d' )
    df.iloc[20:30,2]=np.nan
    #this works
    df['Months since mydate'] = (  pd.to_datetime('15-03-2019') - df['mydate'] )
    conn=sqlite3.connect("test_sqllite_dates.db")
    df.to_sql('mydates',conn, if_exists='replace')
    conn.close()
    conn2=sqlite3.connect("test_sqllite_dates.db")
    df_read=pd.read_sql('select * from mydates',conn2 )
    # this doesn't work
    df_read['Months since mydate 2'] = (  pd.to_datetime('15-03-2019') - df_read['mydate'] )
    conn2.close()
    print(df.dtypes)
    print(df_read.dtypes)