我试图将一个长的.txt
文本表解析为pd.DataFrame
,或者Python中的任何其他可读形式。我尝试了一个成功的方法,但我不完全满意,我想改进它。你知道吗
这是我的.txt
的一个子集:
USAF WBAN STATION NAME CTRY ST CALL LAT LON ELEV(M) BEGIN END
007018 99999 WXPOD 7018 +00.000 +000.000 +7018.0 20110309 20130730
007026 99999 WXPOD 7026 AF +00.000 +000.000 +7026.0 20120713 20170822
007070 99999 WXPOD 7070 AF +00.000 +000.000 +7070.0 20140923 20150926
008260 99999 WXPOD8270 +00.000 +000.000 +0000.0 19960101 20100731
008268 99999 WXPOD8278 AF +32.950 +065.567 +1156.7 20100519 20120323
008307 99999 WXPOD 8318 AF +00.000 +000.000 +8318.0 20100421 20100421
008411 99999 XM20 20160217 20160217
008414 99999 XM18 20160216 20160217
008415 99999 XM21 20160217 20160217
008418 99999 XM24 20160217 20160217
010000 99999 BOGUS NORWAY NO ENRS 20010927 20041019
010010 99999 JAN MAYEN(NOR-NAVY) NO ENJA +70.933 -008.667 +0009.0 19310101 20190203
我尝试了以下方法:
测试1:使用re
解析空格:
with open('test.txt') as f:
lines = f.readlines()
parsed_lines = [re.split("\s+", line) for line in lines]
print(test)
['007018',
'99999',
'WXPOD',
'7018',
'+00.000',
'+000.000',
'+7018.0',
'20110309',
'20130730',
'']
这是正常的,但远远不是最佳的,站名被分割成另一个列表元素,这只显示了我糟糕的regex
能力。你知道吗
测试2:使用字符串位置:
with open('/Users/ivan/weather_isd_noaa/data/isd-history.txt') as f:
lines = f.readlines()
colum_names = lines[0]
usaf_code = []
wban = []
station_name = []
country = []
us_state = []
call = []
lat = []
lon = []
elevation = []
begin = []
end = []
for line in lines:
usaf_code.append(line[:6])
wban.append(line[7:12])
station_name.append(line[13:43])
country.append(line[43:45])
us_state.append(line[46:50])
call.append(line[51:55])
call.append(line[57:64])
lat.append(line[57:64])
lon.append(line[56:73])
elevation.append(line[74:81])
begin.append(line[82:90])
end.append(line[91:100])
df = pd.DataFrame({
'usaf_code': usaf_code,
'wban': wban,
'station_name': station_name,
'country': country,
'us_state': us_state,
'lat': lat,
'lon': lon,
'elevation': elevation,
'begin': begin,
'end': end
})
这产生了一个很好的pd.DataFrame
,很容易清洗。这是一个很好的方法,但我肯定不是一个很好的方法,有一些方法来改进这个功能吗?我希望这个代码是完美的,我不相信那些硬编码的立场。你知道吗
我知道像sed
或awk
这样的工具非常有用,但是现在我只能在这个工具上运行python;当然subprocess
可以做到这一点,但是我想依赖python来实现这一点。你知道吗
在我看来,这绝对是一种固定宽度的格式,即每一列都有自己的固定字符数。你知道吗
所以,不管你的问题是什么,你应该试试
pd.read_fwf()
。https://pandas.pydata.org/pandas-docs/version/0.20/generated/pandas.read_fwf.html
相关问题 更多 >
编程相关推荐