我有记录,其中字段(称为INDATUMAUTDATUMA)应该包含20010101和20141231之间的数字(出于明显的原因)。为了允许丢失值但保持精度到最近的日期,我会将它们存储为浮点数(np.float64)。我希望这会强制偶尔将格式错误的字段(例如2oo41oo9)设置为NA s,但是会破坏熊猫0.18.0或IOPro 1.7.2的导入。

有没有记载的选项可以使用?要不然?

尝试熊猫的关键是

import numpy as np
import pandas as pd
treatments = pd.read_table(filename,usecols=[0,3,4,6], engine='c', dtype={'LopNr':np.uint32,'INDATUMA':np.float64,'UTDATUMA':np.float64,'DIAGNOS':object})


与错误ValueError: invalid literal for float(): 2003o730

为了以防万一,我在IOPro中尝试了以下方法:

import iopro
adapter = iopro.text_adapter(filename, parser='csv',delimiter='\t',output='dataframe',infer_types=False)
adapter.set_field_types({0: 'u4',3:'f8', 4:'f8',6:'object'})
all_treatments.append(adapter[[0,3,4,6]][:])


但这也用iopro.lib.errors.DataTypeError: Could not convert token "2003o730" at record 1 field 3 to float64.Reason: unknown破坏了

数据文件开始于

LopNr   SJUKHUS MVO INDATUMA    UTDATUMA    HDIA    DIAGNOS OP  PVARD   EKOD1   EKOD2   EKOD3   EKOD4   EKOD5   ICD
1562    21001   046 20030707    20030711    I489A   I489A I509      2                       10
1562    21001   046 2003o730    20030801    I501    I501 I489A  DG001   2                       10

最佳答案

您可以在converters中使用参数read_table

def converter(num):
    try:
        return np.float(num)
    except:
        return np.nan

#define each column
converters={'INDATUMA': converter, 'UTDATUMA': converter}

df = pd.read_table(filename, converters=converters)
print df
   LopNr  SJUKHUS  MVO  INDATUMA  UTDATUMA   HDIA DIAGNOS     OP  PVARD  \
0   1562    21001   46  20030707  20030711  I489A   I489A   I509      2
1   1562    21001   46       NaN  20030801   I501    I501  I489A  DG001

   EKOD1  EKOD2  EKOD3  EKOD4  EKOD5  ICD
0     10    NaN    NaN    NaN    NaN  NaN
1      2     10    NaN    NaN    NaN  NaN


或使用errors='coerce'的参数to_numeric后处理:

df['INDATUMA'] = pd.to_numeric(df['INDATUMA'], errors='coerce')
0    20030707
1         NaN
Name: INDATUMA, dtype: float64

08-17 23:37