在带有dtype和转换器的pandas load_csv中强制int32作为dtype而不是int64

时间:2017-05-12 18:08:25

标签: python pandas numpy

https://github.com/pandas-dev/pandas/pull/2708说其他类型的传播正在运行,但是我无法将我的十六进制编码值加载到int32中,它们作为int64进入数据框

数据

2009-01-01T18:55:25Z,574,575,574,575,574,575,574,575,2,True
2009-01-01T18:56:55Z,574,575,574,575,573,574,573,574,2,True
2009-01-01T18:57:25Z,573,574,573,574,573,574,573,574,2,True
2009-01-01T18:57:30Z,573,574,573,574,573,574,573,574,2,True
2009-01-01T19:07:20Z,574,575,574,575,574,575,574,575,1,True
2009-01-01T19:07:55Z,574,575,574,575,574,575,574,575,1,True

名:

names = [
    'datetime',
    'sensorA',
    'sensorB',
    'sensorC',
     ...
    'signal',
]

转换功能:

def hex2int(x):
    return int(x, 16) * 100

转换器:

convs = { i : hex2int for i in range(1,9) }

dtypes:

raw_dtypes = {
    'datetime': datetime.datetime,
    'sensorA': 'int32',
    'sensorA': 'int32',
    'sensorA': 'int32',
     ...
    'signal': 'int32',
}

read_csv:

df = pd.read_csv(filepath, delimiter=',', header=None, names=names, dtype=raw_dtypes, usecols=range(0, NUM_COLS-1), converters=convs, parse_dates=['datetime'])

结果:

>>> df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1308 entries, 0 to 1307
Data columns (total 10 columns):
datetime    1308 non-null datetime64[ns]
sensorA     1308 non-null int64
sensorB     1308 non-null int64
sensorC     1308 non-null int64
sensorD     1308 non-null int64
sensorE     1308 non-null int64
sensorF      1308 non-null int64
sensorG    1308 non-null int64
sensorH    1308 non-null int64
signal      1308 non-null int32
dtypes: datetime64[ns](1), int32(1), int64(8)

最后一列(&#39;信号&#39;)没有使用转换器并根据文档使用正确的dtype:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html如果指定转换器,它们将应用于INSTEAD dtype转换。

我很确定我没有将任何内容溢出到int64中,我的范围是160000 - 80000.我已经尝试将转换器的返回值转换为 return np.int32(x, 16) * 100,但这并未改变任何内容

1 个答案:

答案 0 :(得分:2)

正如文档所述,如果为列指定了alert(myString); //[[a,3,h],[r,y,s]] converter,则只会应用dtype。我认为在版本converter +中会产生警告。

如果应用0.20,则该列中的数据采用通用推理路径,就像您已通过converter一样,它使用int64作为默认值。

所以现在,你能做的最好就是在事后投出dtype。类似的东西:

pd.Series([...converted data ...]