我正在尝试使用DataFrame()。to_sql来输入时间感知的数据帧系列。这是我的代码示例。
times = ['201412120154', '201412110254']
df = pd.DataFrame()
df['time'] = pd.to_datetime(times, utc=True)
df.time.to_sql('test', engine,
dtype={'time': sqlalchemy.TIMESTAMP(timezone=True)})
我收到的错误是:
TypeError: issubclass() arg 1 must be a class
以下代码有效,但显然会导致postgresql列无法识别时区。
times = ['201412120154', '201412110254']
df = pd.DataFrame()
df['time'] = pd.to_datetime(times, utc=True)
df.time.to_sql('test', engine,
dtype={'time': sqlalchemy.TIMESTAMP})
我正在使用python 2.7,pandas 0.15.2,postsgresql 9.3和SQLAlchemy 0.9.7
答案 0 :(得分:3)
更新:这是固定在0.16
这是pandas 0.15.2中的一个错误,它阻碍了您提供带参数的实例化sqlalchemy类型(如TIMESTAMP(timezone=True)
而不是TIMESTAMP
)。这将在下一个版本中修复,但现在您可以使用下面的补丁。
我也会在这里发布解决方法。如果你运行它,你将能够指定用dtype
中to_sql
关键字的参数实例化的sqlalchemy类型:
from pandas.io.sql import SQLTable
def to_sql(self, frame, name, if_exists='fail', index=True,
index_label=None, schema=None, chunksize=None, dtype=None):
"""
patched version of https://github.com/pydata/pandas/blob/v0.15.2/pandas/io/sql.py#L1129
"""
if dtype is not None:
from sqlalchemy.types import to_instance, TypeEngine
for col, my_type in dtype.items():
if not isinstance(to_instance(my_type), TypeEngine):
raise ValueError('The type of %s is not a SQLAlchemy '
'type ' % col)
table = SQLTable(name, self, frame=frame, index=index,
if_exists=if_exists, index_label=index_label,
schema=schema, dtype=dtype)
table.create()
table.insert(chunksize)
pd.io.sql.SQLDatabase.to_sql = to_sql