Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将panda df移动到teradata表:[HY000][teradata][ODBC teradata驱动程序][teradata数据库]时间戳无效_Python_Sql_Pandas_Teradata - Fatal编程技术网

Python 将panda df移动到teradata表:[HY000][teradata][ODBC teradata驱动程序][teradata数据库]时间戳无效

Python 将panda df移动到teradata表:[HY000][teradata][ODBC teradata驱动程序][teradata数据库]时间戳无效,python,sql,pandas,teradata,Python,Sql,Pandas,Teradata,我有一个要移动到teradata表的df。我正在使用一个在这个平台上讨论过的框架。然而,我得到了一些错误。 将df加载到teradata的整个逻辑是: df=some data frame host,username,password = 'host','username', "password" num_of_chunks = 1000 insert_query= "INSERT INTO abc.sample VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,

我有一个要移动到teradata表的df。我正在使用一个在这个平台上讨论过的框架。然而,我得到了一些错误。 将df加载到teradata的整个逻辑是:

df=some data frame
host,username,password = 'host','username', "password"
num_of_chunks = 1000
insert_query= "INSERT INTO abc.sample VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
udaExec = teradata.UdaExec (appName="IMC", version="1.0", logConsole=False)
with udaExec.connect(method="odbc",system=host, username = username,
                         password=password, driver="Teradata") as session:
    file_exist=session.execute(file=r"Path of the bteq file" ,fileType="bteq",ignoreErrors=[3803])
    schedule_chunks = np.array_split(df, num_of_chunks)

    for i,_ in enumerate(schedule_chunks):

        data = [tuple(x) for x in schedule_chunks[i].to_records(index=False)]

            session.executemany(insert_query, data,batch=True) 
1) 如果表不存在,则创建表,否则跳过创建

2) 开始将df加载到表中。(注意,我将向df传递多个xlsx文件,并最终将其附加到teradata表)

我编写了一个bteq脚本来创建一个如下表:

    FROM DBC.TABLES WHERE DATABASENAME = 'abc' AND TABLENAME = 'sample';

.IF ACTIVITYCOUNT <> 0 THEN .GOTO SKIP_CREATION
.IF ACTIVITYCOUNT = 0 THEN .GOTO TABLE_NOT_EXISTS

.LABEL TABLE_NOT_EXISTS 
CREATE TABLE abc.sample ( 
col1 VARCHAR(400) CHARACTER  SET LATIN NOT CASESPECIFIC, 
col2 VARCHAR(400) CHARACTER SET LATIN NOT CASESPECIFIC,
.
.
col23  TIMESTAMP(0) WITH TIME ZONE FORMAT 'YYYY-MM-DD HH:MI:SSZ', 
col24 TIMESTAMP(0) WITH TIME ZONE FORMAT 'YYYY-MM-DD HH:MI:SSZ'
);

.LABEL SKIP_CREATION
.LOGOFF
运行此操作时,我会收到以下错误消息:

DatabaseError:[HY000][Teradata][ODBC Teradata驱动程序][Teradata 数据库]无效的时间戳


有人能帮我解决什么问题吗?还需要一些建议,如果我写的bteq脚本正确。我希望避免每次删除表并创建一个新表

我成功地将数据帧推入Teradata。我所做的只是将数据帧中的时间戳列从datetime64转换为object。下面是我在运行上述代码之前添加的唯一一行代码

df=df.astype(object).where(pd.notnull(df),'')

你的时间戳是什么样子的?时间戳是datetime64格式的,看起来像:df[ts_cols[dt]=pd.to_datetime(df[ts_cols[dt]],格式=“%Y-%m-%d%H:%m:%S”)。对不起,不清楚。您可以发布一些您试图插入到表中的时间戳的示例吗?因此时间戳最终看起来像2019-09-06 08:00:00,2019-09-08 04:00:00,2019-09-10 15:00:00,为了替换没有时间戳的空白,我将其替换为类似1900-01-01 00:00:00的伪时间戳,我的df中有4个格式相同的时间戳列。这些是合法的时间戳。尝试使列变为varchar。然后在运行insert之后,您可以测试是否有错误的时间戳-
选择trycast(作为时间戳(0)),其中trycast(作为时间戳(0))为空。