【问题标题】:Invalid Date when inserting to Teradata using Python使用 Python 插入 Teradata 时日期无效
【发布时间】:2019-03-13 13:54:05
【问题描述】:

我正在开发一个 python 片段,它将使用 pyodbc 将数据帧插入到 teradata 表中。我无法克服的错误是......

File "file.py", line 33, in <module>
cursor.execute("INSERT INTO DB.TABLE (MASDIV,TRXTYPE,STATION,TUNING_EVNT_START_DT,DOW,MOY,TRANSACTIONS)VALUESrow['MASDIV'],'trx_chtr',row['STATION'],row['TUNING_EVNT_START_DT'],row['DOW'],row['MOY'],row['TRANSACTIONS'])
pyodbc.DataError: ('22008', '[22008] [Teradata][ODBC Teradata Driver][TeradataDatabase] Invalid date supplied for Table.TUNING_EVNT_START_DT. (-2666) (SQLExecDirectW)')

为了填写...我有一个 Teradata 表,我想获取一个数据框并将其插入其中。那张桌子被做成了。

CREATE SET TABLE  DB.TABLE, FALLBACK
   (PK decimal(10,0) NOT NULL GENERATED ALWAYS AS IDENTITY
            (START WITH 1 
            INCREMENT BY 1 
            MINVALUE 1 
            --MAXVALUE 2147483647 
            NO CYCLE),
    TRXTYPE VARCHAR(10),
    MASDIV VARCHAR(30),
    STATION VARCHAR(50),
    TUNING_EVNT_START_DT DATE format 'MM/DD/YYYY',
    DOW VARCHAR(3),
    MOY VARCHAR(10),
    TRANSACTIONS INT,
    ANOMALY_FLAG INT NOT NULL DEFAULT 1)
PRIMARY INDEX (PK);

主键和异常标志会自动填写。下面是我正在使用并遇到错误的脚本。它正在读取 csv 并创建数据框。 csv 的前两行(包括标题)看起来像...

MASDIV              | STATION                    | TUNING_EVNT_START_DT | DOW |    MOY    | TRANSACTIONS

Staten Island       | WFUTDT4                    |         9/12/18      | Wed | September | 538

San Fernando Valley | American Heroes Channel HD |        6/28/2018     | Thu | June      | 12382

这是我正在使用的脚本...

 '''
Written by Bobby October 1st, 2018
REFERENCE
https://tomaztsql.wordpkress.com/2018/07/15/using-python-pandas-dataframe-to-read-and-insert-data-to-microsoft-sql-server/
'''

import pandas as pd
import pyodbc
from datetime import datetime

#READ IN CSV TEST DATA
df = pd.read_csv('Data\\test_set.csv')
print('CSV LOADED')

#ADJUST DATE FORMAT
df['TUNING_EVNT_START_DT'] = pd.to_datetime(df.TUNING_EVNT_START_DT)
#df['TUNING_EVNT_START_DT'] = 
df['TUNING_EVNT_START_DT'].dt.strftime('%m/%d/%Y')
df['TUNING_EVNT_START_DT'] = df['TUNING_EVNT_START_DT'].dt.strftime('%Y-%m-%d')
print('DATE FORMAT CHANGED')
print(df)

#PUSH TO DATABASE
conn = pyodbc.connect('dsn=ConnectR')
cursor = conn.cursor()

# Database table has columns...
# PK | TRXYPE | MASDIV | STATION | TUNING_EVNT_START_DT | DOW | MOY | 
TRANSACTIONS | ANOMALY_FLAG
# PK is autoincrementing, TRXTYPE needs to be specified on insert command, 
and ANOMALY_FLAG defaults to 1 for yes

for index, row in df.iterrows():
        cursor.execute("INSERT INTO DLABBUAnalytics_Lab.Anomaly_Detection_SuperSet(MASDIV,TRXTYPE,STATION,TUNING_EVNT_START_DT,DOW,MOY,TRANSACTIONS)VALUES(?,?,?,?,?,?,?)", row['MASDIV'],'trx_chtr',row['STATION'],row['TUNING_EVNT_START_DT'],row['DOW'],row['MOY'],row['TRANSACTIONS'])
    conn.commit()
    print('RECORD ENTERED')

print('DF SUCCESSFULLY WRITTEN TO DB')

#PULL FROM DATABASE
sql_conn = pyodbc.connect('dsn=ConnectR')
query = 'SELECT * FROM DLABBUAnalytics_Lab.Anomaly_Detection_SuperSet;'
df = pd.read_sql(query, sql_conn)
print(df)

因此,我正在转换日期格式并尝试将逐行插入 Teradata 表中。第一条记录读入并在数据库中。第二条记录抛出顶部的错误。日期是 2018 年 6 月 28 日,我已将其更改为 18 年 6 月 11 日,只是为了看看是否有混淆日期和月份,但这仍然有同样的问题。列是否在某处脱落,并且它正在尝试将不同列的值插入到日期列中。

非常感谢任何想法或帮助!

【问题讨论】:

  • Teradata 需要两位数格式的日期和月份,即06/28/18 而不是6/28/18。只有 TPT 允许使用 VarDate 的单位数日/月
  • df['TUNING_EVNT_START_DT'] = df['TUNING_EVNT_START_DT'].dt.strftime('%Y-%m-%d') 将其转换为 2018-06-28
  • 当它返回 YYYY-MM-DD 格式时,您应该在表定义中使用它而不是 format 'MM/DD/YYYY'
  • 哇。做到了。我刚刚重建了表格并将格式更改为 YYYY-MM-DD 并且一切运行顺利。非常感谢。

标签: python sql datetime teradata pyodbc


【解决方案1】:

所以问题在于表格的格式。最初它被构建为具有 CSV 中的 MM/DD/YYYY 格式,但将其更改为 YYYY-MM-DD 格式使得脚本可以完美运行。

谢谢!

【讨论】:

    猜你喜欢
    • 2019-02-22
    • 1970-01-01
    • 2016-05-10
    • 2012-05-22
    • 2021-11-06
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 2016-10-05
    相关资源
    最近更新 更多