pandas中的read_csv - 如何将特定行用作标题

时间:2013-11-30 04:18:01

标签: python pandas

要解析这个文件:

https://gist.github.com/anonymous/7714935

看起来像:

metadata line
metadata line
metadata line
metadata line
metadata line
metadata line
metadata line 
metadata line
metadata line
metadata line
metadata line
metadata line
metadata line
metadata line
metadata line
metadata line
metadata line
metadata line
metadata line
metadata line
metadata line
metadata line

col1   col2         col3    UTCDate   UTCTime       col6       col7   
                           (m)      (MDY)     (sec)    (weeks)      (MDY)     
string1- string2-        0.000 11/06/2013 313585.10 1765.00000 11/06/2013 
string1- string2-        0.000 11/06/2013 313585.30 1765.00000 11/06/2013 
...

我可以使用如下代码阅读:

import pandas as pd
import datetime as dt
names=['col1','col2','col3','UTCDate','UTCTime','col6','col7']

def parse(UTCDate,UTCTime):
    return dt.datetime.strptime(UTCDate, '%m/%d/%Y') + dt.timedelta(seconds=float(UTCTime))

df = pd.read_csv(filename, delimiter=r'\s+', skiprows=25, index_col='date', parse_dates={'date':['UTCDate','UTCTime']}, names=names, date_parser=parse)

有没有办法避免在列表中指定“名称”,并尝试解析 而不是标题?

标题是行:

col1   col2         col3    UTCDate   UTCTime       col6       col7

要点中的第24行。 我想keep_date_col = True,header = 0并传递一个行列表来跳过像[arange(0,23),25] ..但是没有用。

3 个答案:

答案 0 :(得分:1)

我认为你的一般方法还可以。在我认为它失败的地方,至少对我来说,是使用分隔符和Longitude / Latitude列。您的分隔符是'\ s +',但这些列中的数据看起来像三列而不是一列。

Latitude        Longitude
41 20 54.57907  -70 38 14.25924

也许您可以使用选项卡替换所有双空格并使用选项卡作为分隔符。或者,如果您只需要前七列,只需删除剩余部分,然后再将其提供给数据帧。

答案 1 :(得分:0)

您是否尝试了header=#的{​​{1}} arg?

read_csv()

文档状态:

  
    

header:int,整数列表         用作列名的行号和开头         数据。如果没有pd.read_csv(filename, delimiter=r'\s+', skiprows=25, index_col='date', parse_dates={'date':['UTCDate','UTCTime']}, header=26, date_parser=parse)通过则默认为0,否则为names。明确地         传递None以便能够替换现有名称。标题可以是         一个整数列表,指定了多索引的行位置         列E.g. [0,1,3]。干预未指定的行将是         跳过(例如,跳过此示例中的2)。注意这个参数         如果header=0,则忽略注释行和空行,因此header = 0         表示第一行数据而不是文件的第一行。

  

答案 2 :(得分:0)

我不会称之为过于优雅,但你可以将这个问题归结为处理要跳过的可变行数,在csv的帮助下

import csv
import pandas as pd

counter=0
testfile=open(filename, 'r')
filereader = csv.reader(testfile, delimiter=r'\s+')
for row in filereader :
    counter += 1 #Keep track of row number
    if 'col1' in row: #Or whatever string you're looking for as the first row
        finalcount=counter

Output=pd.read_csv(filename,sep=r'\s+',skiprows=finalcount-1)