Python 带datetime和时区的SQLite

Python 带datetime和时区的SQLite,python,sqlite,datetime,pandas,sqlalchemy,Python,Sqlite,Datetime,Pandas,Sqlalchemy,我需要使用一系列包含时区的datetime来填充SQLite db,但我面临一个值错误ValueError:无法将DatetimeIndex转换为数据类型datetime64[us]。我用一个变通办法来解决这个问题,但这是一个肮脏的问题 你现在有没有一个最流线型的方法来做到这一点 In[2]: import pandas as pd import sqlalchemy as sql conn = sql.create_engine('sqlite:///test_db_supp.sqlite')

我需要使用一系列包含时区的datetime来填充SQLite db,但我面临一个值错误
ValueError:无法将DatetimeIndex转换为数据类型datetime64[us]
。我用一个变通办法来解决这个问题,但这是一个肮脏的问题

你现在有没有一个最流线型的方法来做到这一点

In[2]: import pandas as pd
import sqlalchemy as sql
conn = sql.create_engine('sqlite:///test_db_supp.sqlite')
index = pd.date_range('2015-01-01', freq = '30Min', periods=5)
df = pd.DataFrame(index = index, data = range(len(index)))


In[3]: ## Integrate as a string
df.to_sql(name='test', con=conn, if_exists = 'replace')
dff = pd.read_sql('test', conn)
pd.to_datetime(dff['index'])

Out[3]: 
0   2015-01-01 00:00:00
1   2015-01-01 00:30:00
2   2015-01-01 01:00:00
3   2015-01-01 01:30:00
4   2015-01-01 02:00:00
Name: index, dtype: datetime64[ns]


In[4]: df = df.tz_localize('Europe/Paris')
## Integrate with timezone
df.to_sql(name='test', con=conn, if_exists = 'replace')
dff = pd.read_sql('test', conn)
pd.to_datetime(dff['index'])

Traceback (most recent call last):
  File "/Users/alex/anaconda/lib/python2.7/site-    packages/IPython/core/interactiveshell.py", line 3066, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-4-4b3db52574b7>", line 3, in <module>
    df.to_sql(name='test', con=conn, if_exists = 'replace')
  File "/Users/alex/anaconda/lib/python2.7/site-packages/pandas/core/generic.py", line 1003, in to_sql
    dtype=dtype)
  File "/Users/alex/anaconda/lib/python2.7/site-packages/pandas/io/sql.py", line 569, in to_sql
chunksize=chunksize, dtype=dtype)
  File "/Users/alex/anaconda/lib/python2.7/site-packages/pandas/io/sql.py", line 1241, in to_sql
table.insert(chunksize)
  File "/Users/alex/anaconda/lib/python2.7/site-packages/pandas/io/sql.py", line 743, in insert
keys, data_list = self.insert_data()
  File "/Users/alex/anaconda/lib/python2.7/site-packages/pandas/io/sql.py", line 724, in insert_data
d = b.values.astype('M8[us]').astype(object)
  File "/Users/alex/anaconda/lib/python2.7/site-packages/pandas/tseries/index.py", line 783, in astype
raise ValueError('Cannot cast DatetimeIndex to dtype %s' % dtype)
ValueError: Cannot cast DatetimeIndex to dtype datetime64[us]


In[5]: ## Integrate with timezone as a string
df.index = df.index.map(str)
df.to_sql(name='test', con=conn, if_exists = 'replace')
dff = pd.read_sql('test', conn)
pd.to_datetime(dff['index'])

Out[5]: 
0   2014-12-31 23:00:00
1   2014-12-31 23:30:00
2   2015-01-01 00:00:00
3   2015-01-01 00:30:00
4   2015-01-01 01:00:00
Name: index, dtype: datetime64[ns]
[2]中的
:将熊猫作为pd导入
将sqlalchemy作为sql导入
conn=sql.create\u引擎('sqlite:///test_db_supp.sqlite')
索引=pd.日期范围('2015-01-01',频率='30分钟',周期=5)
df=pd.DataFrame(index=index,data=range(len(index)))
在[3]中:##集成为字符串
to_sql(name='test',con=conn,如果_存在='replace')
dff=pd.read\u sql('test',conn)
pd.to_日期时间(dff[“索引])
出[3]:
0   2015-01-01 00:00:00
1   2015-01-01 00:30:00
2   2015-01-01 01:00:00
3   2015-01-01 01:30:00
4   2015-01-01 02:00:00
名称:索引,数据类型:datetime64[ns]
在[4]中:df=df.tz_本地化('欧洲/巴黎')
##与时区整合
to_sql(name='test',con=conn,如果_存在='replace')
dff=pd.read\u sql('test',conn)
pd.to_日期时间(dff[“索引])
回溯(最近一次呼叫最后一次):
文件“/Users/alex/anaconda/lib/python2.7/site-packages/IPython/core/interactiveshell.py”,第3066行,运行代码
exec(代码对象、self.user\u全局、self.user\n)
文件“”,第3行,在
to_sql(name='test',con=conn,如果_存在='replace')
文件“/Users/alex/anaconda/lib/python2.7/site packages/pandas/core/generic.py”,第1003行,在to_sql中
dtype=dtype)
文件“/Users/alex/anaconda/lib/python2.7/site packages/pandas/io/sql.py”,第569行,在to_sql中
chunksize=chunksize,dtype=dtype)
文件“/Users/alex/anaconda/lib/python2.7/site packages/pandas/io/sql.py”,第1241行,在to_sql中
表.插入(块大小)
文件“/Users/alex/anaconda/lib/python2.7/site packages/pandas/io/sql.py”,插入部分第743行
键,数据列表=self.insert\u data()
文件“/Users/alex/anaconda/lib/python2.7/site packages/pandas/io/sql.py”,第724行,插入_数据
d=b.values.astype('M8[us]')。astype(对象)
astype中的文件“/Users/alex/anaconda/lib/python2.7/site packages/pandas/tseries/index.py”,第783行
raise VALUETERROR('无法将DatetimeIndex强制转换为数据类型%s“%dtype”)
ValueError:无法将DatetimeIndex强制转换为数据类型datetime64[us]
在[5]中:##将时区作为字符串进行集成
df.index=df.index.map(str)
to_sql(name='test',con=conn,如果_存在='replace')
dff=pd.read\u sql('test',conn)
pd.to_日期时间(dff[“索引])
出[5]:
0   2014-12-31 23:00:00
1   2014-12-31 23:30:00
2   2015-01-01 00:00:00
3   2015-01-01 00:30:00
4   2015-01-01 01:00:00
名称:索引,数据类型:datetime64[ns]

您得到的错误可能是pandas中的一个错误,但问题是sqlalchemy在任何情况下都不支持使用时区信息()写入/读取日期时间值,因此可能无法在pandas中完全修复。现在最好的方法是像您所做的那样自己转换为字符串(这是datetimes在后台发生的事情)。将它们转换为UTC是一种选择吗?