df.to_sql给出TypeError,其中dtype = sqlalchemy.timestamp(timezone = True)

时间:2014-12-15 08:03:36

标签: python pandas sqlalchemy

我正在尝试使用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

1 个答案:

答案 0 :(得分:3)

更新:这是固定在0.16

这是pandas 0.15.2中的一个错误,它阻碍了您提供带参数的实例化sqlalchemy类型(如TIMESTAMP(timezone=True)而不是TIMESTAMP)。这将在下一个版本中修复,但现在您可以使用下面的补丁。


我也会在这里发布解决方法。如果你运行它,你将能够指定用dtypeto_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