熊猫DataFrame自动解析日期

时间:2019-07-11 21:39:01

标签: python oracle pandas dataframe cx-oracle

我试图将一堆ExcelSheets加载到Oracle表中。 excelsheet不一致。因此,需要基于Excelsheets中的列动态生成Oracle中的表。这是我在互联网上找到的最简单的解决方案,因此我继续使用这种方法。我是Python的新手。

以以下结构为例。

enter image description here

我正在尝试将以下Excel导入到 MEM_TABLE 表中。 DATE 字段不一致,可以使用NA,_ND或Date作为值。

我用来加载excel的代码如下

xls_file = pd.ExcelFile("Excel File")

df =  xls_file.parse('Sheet1',parse_dates=True)
df =  df.replace(np.nan, '') #replace NaN with blank string
df = df.replace('NA', '') #replace "NA" with blank string
df = df.replace('_ND', '') #replace "NA" with blank string
df.to_sql('MEM_TABLE', conn_ora, if_exists='append', index = False )

to_sql 方法创建的表具有以下结构

MEM_TABLE(
  date    CLOB         NULL,
  emp_nbr NUMBER(19,0) NULL
)

在数据框中,它读取的内容类似

 DATE                       EMP_NBR
0                             2
1  2018-01-04 00:00:00        1
2  2018-01-01 00:00:00        2
3  2018-01-03 00:00:00        1
4                             1
5                             1

在创建DataFrame时,看起来Pandas会自动强制转换1/4/2018。 我收到以下错误,我认为是因为表 MEM_TABLE 中的 DATE 列是CLOB,而dataFrame中的Date字段具有DATE对象。看起来日期对象无法插入到CLOB单元格中。

  

TypeError:期望字符串或字节对象

如果日期在字符串中(即“ 1/4/2018”),则不会出现任何错误。

我的问题是 无论如何,在创建数据框时是否要在日期字段上禁用自动解析?

2 个答案:

答案 0 :(得分:0)

在读取熊猫数据框时,使用'parse_dates' = False

df = xls_file.parse('Sheet1',parse_dates=False)

答案 1 :(得分:0)

我使用的解决方法是我创建了一种方法undate(从现有解决方案中使用),以将日期恢复为原始格式。并在所有DataFrame列中运行该方法。该实现是蛮力的,但它有效:P。我的最终代码看起来像这样。

def undate(x):
    if pd.isnull(x):
        return x
    try:
        return x.strftime('%d/%m/%Y')
    except AttributeError:
        return x
    except Exception:
        raise

for col in df.columns:
        df[col] = df[col].apply(undate)