要解析这个文件:
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] ..但是没有用。
答案 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)