清理文本文件并在python中作为pandas数据框导入

时间:2020-07-15 17:18:20

标签: python pandas time-series

我有一个带有标题和气象数据的时间序列文件,如下所示:

“ NAME:时间序列结果

LOC_I:130

LOC_J:181

LAT:-9.03

LON:-35.22

单位:秒

SECONDS YY MM DD hh mm ss wind_x wind_y hourly_prec rel_hum

| BeginResults |

0 2007 1 1 0 0 0 1.2 0.5 0 97.5

3600 2007 1 1 1 0 0 2.3 0.7 0 97.6

7200 2007 1 1 2 0 0 2.6 0.7 0 97.5

10800 2007 1 1 3 0 0 1.9 0.6 0 97.4

...

| EndResults |“

我需要将数值数据作为大熊猫数据框导入,并将第[6]行中的信息作为列,因此我必须删除[0:5],[7]和[-1]行,但是在简单的python代码中无法成功处理此问题,您能帮我吗?

3 个答案:

答案 0 :(得分:0)

假设您只想删除前N行,为什么不只是将整个csv(是csv?)作为DataFrame导入,然后删除前N,或者将要保留的行重新分配到新的DataFrame中,用iloc属性?喜欢:

In [21]: df                       
Out[21]: 
   A  B   C   D
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11

In [24]: df1 = df.iloc[1:,:]      

In [25]: df1                      
Out[25]: 
   A  B   C   D
1  4  5   6   7
2  8  9  10  11

答案 1 :(得分:0)

尝试一下:

import pandas as pd

pd.read_csv("/path/to/file", 
            sep=" ",
            header=6,
            skiprows=[0, 1, 2, 3, 4, 5, 7],
            engine="python",
            skipfooter=1)

sep使其使用空格作为分隔符来拆分列。根据文档,看起来这也可以使用正则表达式,但是我从未尝试过。

header使数据框使用第6行(索引为0)作为列名。

skiprows告诉熊猫您要跳过的行。除了行索引列表之外,您还可以给它一个int(从开始到跳过的行数)或一个可调用的(如果它的值为True,则跳过该行)。如果需要,请在链接的文档中获取更多详细信息。

engine确定它使用的引擎。这是必需的,因为python引擎仅支持skipfooter

skipfooter告诉您要从底部跳过多少行。

read_csv()的完整文档为here,如果您需要在解析中添加更多限制,则此文档非常详尽。

答案 2 :(得分:0)

尝试一下:

import pandas as pd
import os

str_data = """"NAME: Timeseries results

LOC_I: 130

LOC_J: 181

LAT: -9.03

LON: -35.22

UNITS: SECONDS

SECONDS YY MM DD hh mm ss wind_x wind_y hourly_prec rel_hum

|BeginResults|

0 2007 1 1 0 0 0 1.2 0.5 0 97.5

3600 2007 1 1 1 0 0 2.3 0.7 0 97.6

7200 2007 1 1 2 0 0 2.6 0.7 0 97.5

10800 2007 1 1 3 0 0 1.9 0.6 0 97.4

|EndResults|"""

text = os.linesep.join([s for s in str_data.splitlines() if s])
list_data = text.split('\n')
weather_data_header = list_data[6].split()
weather_data = [row.split() for row in list_data[8:len(list_data)-1]]
df = pd.DataFrame(weather_data, columns=weather_data_header)
df.head()