我有一个脚本,将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)