Pandas读取csv数据类型前导零

2024-06-07 21:02:17 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我从NOAA读取了一个车站代码csv文件,如下所示:

"USAF","WBAN","STATION NAME","CTRY","FIPS","STATE","CALL","LAT","LON","ELEV(.1M)","BEGIN","END"
"006852","99999","SENT","SW","SZ","","","+46817","+010350","+14200","",""
"007005","99999","CWOS 07005","","","","","-99999","-999999","-99999","20120127","20120127"

前两列包含气象站的代码,有时它们有前导零。当pandas在不指定数据类型的情况下导入它们时,它们会变成整数。这没什么大不了的,因为我可以循环遍历数据帧索引,并用类似"%06d" % i的内容替换它们,因为它们总是6位数字,但是你知道。。。那是懒人的方式。

使用以下代码获取csv:

file = urllib.urlopen(r"ftp://ftp.ncdc.noaa.gov/pub/data/inventories/ISH-HISTORY.CSV")
output = open('Station Codes.csv','wb')
output.write(file.read())
output.close()

一切都很好,但是当我试着用这个读的时候:

import pandas as pd
df = pd.io.parsers.read_csv("Station Codes.csv",dtype={'USAF': np.str, 'WBAN': np.str})

或者

import pandas as pd
df = pd.io.parsers.read_csv("Station Codes.csv",dtype={'USAF': str, 'WBAN': str})

我收到一条令人讨厌的错误信息:

File "C:\Python27\lib\site-packages\pandas-0.11.0-py2.7-win32.egg\pandas\io\parsers.py", line 401, in parser
_f
    return _read(filepath_or_buffer, kwds)
  File "C:\Python27\lib\site-packages\pandas-0.11.0-py2.7-win32.egg\pandas\io\parsers.py", line 216, in _read
    return parser.read()
  File "C:\Python27\lib\site-packages\pandas-0.11.0-py2.7-win32.egg\pandas\io\parsers.py", line 633, in read
    ret = self._engine.read(nrows)
  File "C:\Python27\lib\site-packages\pandas-0.11.0-py2.7-win32.egg\pandas\io\parsers.py", line 957, in read
    data = self._reader.read(nrows)
  File "parser.pyx", line 654, in pandas._parser.TextReader.read (pandas\src\parser.c:5931)
  File "parser.pyx", line 676, in pandas._parser.TextReader._read_low_memory (pandas\src\parser.c:6148)
  File "parser.pyx", line 752, in pandas._parser.TextReader._read_rows (pandas\src\parser.c:6962)
  File "parser.pyx", line 837, in pandas._parser.TextReader._convert_column_data (pandas\src\parser.c:7898)
  File "parser.pyx", line 887, in pandas._parser.TextReader._convert_tokens (pandas\src\parser.c:8483)
  File "parser.pyx", line 953, in pandas._parser.TextReader._convert_with_dtype (pandas\src\parser.c:9535)
  File "parser.pyx", line 1283, in pandas._parser._to_fw_string (pandas\src\parser.c:14616)
TypeError: data type not understood

这是一个相当大的csv(31k行),所以也许这与它有关?


Tags: csviniosrcparserpandasreaddata
3条回答

这是一个熊猫数据类型猜测的问题。

熊猫看到数字,然后猜测你想要的是数字。

为了让熊猫不怀疑你的意图,你应该设置你想要的数据类型:object

pd.read_csv('filename.csv', dtype={'leading_zero_column_name': object})

会成功的

这个问题让我在解析一个有序列号的文件时感到头疼。由于未知原因,00794和000794是两个不同的序列号。我终于想到

converters={'serial_number': lambda x: str(x)}

如果不希望字符串成为对象,则必须指定字符串的长度。
例如:

dtype={'USAF': '|S6'}

我找不到这方面的参考资料,但我似乎记得韦斯曾讨论过这个问题(也许是在一次谈话中)。他建议numpy不允许“适当”的可变长度字符串(请参见本文question/answer),并且使用最大长度填充数组通常会导致难以置信的空间效率低下(即使字符串很短,它将使用与最长字符串相同的空间)。

正如@Wes所指出的,这也是一种情况:

dtype={'USAF': object}

效果也一样。

相关问题 更多 >

    热门问题