Name,USAF,NCDC,Date,HrMn,I,Type,Dir,Q,I,Spd,Q
OXNARD,723927,93110,19590101,0000,4,SAO,270,1,N,3.1,1,
OXNARD,723927,93110,19590101,0100,4,SAO,338,1,N,1.0,1,
OXNARD,723927,93110,19590101,0200,4,SAO,068,1,N,1.0,1,
OXNARD,723927,93110,19590101,0300,4,SAO,068,1,N,2.1,1,
OXNARD,723927,93110,19590101,0400,4,SAO,315,1,N,1.0,1,
OXNARD,723927,93110,19590101,0500,4,SAO,999,1,C,0.0,1,
....
OXNARD,723927,93110,19590102,0000,4,SAO,225,1,N,2.1,1,
OXNARD,723927,93110,19590102,0100,4,SAO,248,1,N,2.1,1,
OXNARD,723927,93110,19590102,0200,4,SAO,999,1,C,0.0,1,
OXNARD,723927,93110,19590102,0300,4,SAO,068,1,N,2.1,1,
以下是存储每小时风速的csv文件片段我想做的是在csv文件中选择每天每小时的风,并将它们存储到一个临时的每日列表中,该列表存储了当天的所有每小时值(如果没有缺失值,则为24)。然后输出当天的列表,为第二天创建新的空列表,定位第二天的每小时速度,输出每日列表等等,直到文件结束。
我正在努力寻找一个好的方法来完成这个任务。我的一个想法是读取第i行,确定日期(YYYY-MM-DD),然后读取第i+1行,看看该日期是否与日期i匹配。如果匹配,那么我们在同一天。如果不匹配,那么我们在第二天。但我甚至不知道如何读取文件中的下一行......
任何建议来执行这个方法或一个全新的(和更好的?!)方法是最受欢迎的。谢谢你提前!
obs_in = open(csv_file).readlines()
for i in range(1,len(obs_in)):
# Skip over the header lines
if not str(obs_in[i]).startswith("Identification") and not str(obs_in[i]).startswith("Name"):
name,usaf,ncdc,date,hrmn,i,type,dir,q,i2,spd,q2,blank = obs_in[i].split(',')
current_dt = datetime.date(int(date[0:4]),int(date[4:6]),int(date[6:8]))
current_spd = spd
# Read in next line's date: is it in the same day?
# If in the same day, then append spd into tmp daily list
# If not, then start a new list for the next day
3条答案
按热度按时间ecbunoof1#
你可以利用数据文件的良好有序性,使用
csv.dictreader
,然后你可以很简单地建立一个按日期组织的风速字典,你可以根据自己的喜好处理它。注意,csv阅读器返回字符串,所以你可能想在汇编列表时转换成其他合适的类型。显然,您可以将
append
调用的参数更改为元组,例如append((float(k['Spd']), datetime.datetime.strptime(k['Date']+k['HrMn'],'%Y%m%D%H%M))
,这样您也可以收集时间。如果文件中有多余的空格,可以使用
skipinitialspace
参数:rdr = csv.DictReader(open('winds.csv','rt'), fieldnames=ff, skipinitialspace=True)
。如果这仍然不起作用,您可以预处理标题行:bydate
的访问方式类似于常规字典。要访问特定日期的数据,请执行bydate['19590101']
。要获取已处理日期的列表,请执行bydate.keys()
。如果你想在阅读文件时将它们转换成Python datetime对象,你可以导入
datetime
,然后用bydate[datetime.datetime.strptime(k['Date'], '%Y%m%d')].append(k['Spd'])
替换赋值行。vmpqdwk32#
可能是这样的。
我还发现,我必须使用
ii
而不是i
来表示数据的“I”字段,因为您使用i
表示循环计数器。kmbjn2e33#
我知道这个问题是很多年前的问题了,但我想指出一个小的bash脚本可以很好地执行这个任务。我将您的示例复制到一个名为data.txt的文件中,脚本如下所示:
请注意,由于某些原因,这在MAC上不起作用,因为date命令的实现不同,所以在MAC上,您需要使用
gdate
(来自coreutils)或更改选项以匹配MAC上的date选项。如果文件中缺少日期,grep命令将生成一个空文件-此链接显示了避免此问题的方法:how to stop grep creating empty file if no results