Python 在pandas中读取\u csv-如何使用特定行作为标题

Python 在pandas中读取\u csv-如何使用特定行作为标题,python,pandas,Python,Pandas,要分析此文件的字符串: 这看起来像: 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 metad

要分析此文件的字符串:

这看起来像:

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行。
我正在考虑保持_date_col=True,header=0,并传递一个要跳过的行列表,如[arange(0,23),25]。。但是没有起作用。

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

Latitude        Longitude
41 20 54.57907  -70 38 14.25924

也许您可以用一个制表符替换所有的双空格,并将该制表符用作分隔符。或者,如果您只需要前七列,只需在将其提供给数据帧之前删除其余的列。

您是否尝试了
头=#
arg for
read\u csv()

pd.read\u csv(文件名,分隔符=r'\s+',skiprows=25,索引=date',解析日期={'date':['UTCDate','UTCTime']},头=26,日期解析=parse)

文件说明:

标题:int,int列表 要用作列名的行号,以及 数据。如果未传递
名称
,则默认为0,否则
。明确地 通过
header=0
可以替换现有名称。标题可以是 一个整数列表,用于为上的多索引指定行位置 列,例如[0,1,3]。未指定的中间行将被删除 跳过(例如,本例中跳过2个)。请注意,此参数 如果
跳过\u blank\u lines=True
,则忽略注释行和空行,因此页眉=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)

我需要所有的专栏,我将示例缩减为7列,以降低问题的复杂性。纬度和经度的问题得到了解决,因为在我声明的名称中增加了列('LatD'、'LatM'、'LatS'、'LonD'、'LonM'、'LonS'),我应该在2字段上使用一个转换器,使用不同的表示法(可能是十进制)存储经度和纬度值因此,在df中保留与标题中相同的列名。我认为这两种方法都可以。你让它工作了吗?还没有,尝试你的方法我很难理解如何替换分隔符,而不是一行一行地在文件中循环(我的真实数据可以是数十万行)。一旦我解决了这个问题,我可以尝试使用“linecache.getline”来生成“名称”列表:header=linecache.getline(r,24)”.join(header.split()).split(“”)没有,用制表符替换双空格将起作用,但不是对所有列都起作用,其中一些列是单间距的