2012-08-15 74 views
1

我正在编写一个将大型CSV文件分块为更小的分块文件的脚本。它交叉引用一个日志文件,该日志文件包含最后一个被分块的时间戳,以便只有晚于记录时间的时间戳被写入/分块。从列表中获取时间戳的Python错误

csv文件的第一列有一个时间戳,其格式为%Y%m%d %H%M%S。 CSV文件还有四行标题信息,我不希望/不需要在我的脚本中使用rows in ts_pre子句删除的信息。

log_lookup()函数只是从日志中提取我正在查看的特定工作站的CSV文件的最后一个时间序列。显然,我正在与六个不同的工作站进行合作,这些工作站都有不同的信息栏,除非它们与第二段中描述的结构相同。

局部脚本是:

import csv, sys, datetime 

def log_lookup(): 
    global STN_num 
    global STN_date 
    with open('/home/log.txt', 'rb') as open_log:  
     log_file = csv.reader(open_log) 
      for row in log_file: 
       for item in row: 
        STN_date.append(item) 
      if find == 'STN_1': 
       return STN_date[1] 
      if find == 'STN_2':   
       return STN_date[2] 
      if find == 'STN_3': 
       return STN_date[3] 
      if find == 'STN_4': 
       return STN_date[4] 
      if find == 'STN_5': 
       return STN_date[5] 
      if find == 'STN_6': 
       return STN_date[6] 

def get_ts(line): 
    print line[0:19] 
    return datetime.datetime.strptime(line, "%Y/%m/%d %H:%M:%S") 

def main(): 
    log = str(log_lookup()) #useful for knowing when to start chunking 
    log_datetime = datetime.datetime.strptime(log, "%Y/%m/%d %H:%M:%S")  

    with open(sys.argv[1], 'rb') as open_file: 
     ts_from_file = csv.reader(open_file) 
     for genrows in ts_from_file:    
      ts_pre.append(genrows) 
      for rows in ts_pre:    
       if rownum < 4: 
        ts_pre.pop() 
        rownum += 1 
       else:  
        for line in rows:        
         if get_ts(line) > log_datetime:     
          timeseries.append(line) 

日志文件很简单:

0 
2011/10/06 18:40:00 
2012/06/27 13:25:00 
1900/01/01 00:00:00 
2011/08/03 14:55:00 
2012/06/27 20:05:00 
2011/10/03 19:25:00 

... 0作为占位符。 (是明显的,我不是一个程序员?)

一个例子CSV文件看起来像:

"2011/10/03 16:40:00",0,0 
"2011/10/03 16:45:00",1,0 
"2011/10/03 16:50:00",2,0 
"2011/10/03 16:55:00",3,0 

的错误我得到当ts_line(line)功能是它的说法line[0:19]是:

2011/10/03 16:40:00 
0 

,函数返回0和Python抛出这个错误:

ValueError: time data '0' does not match format '%Y/%m/%d %H:%M:%S' 

我已验证所返回的0是CSV文件中的第二项,但我很困惑为什么Python在我的切片选择中完全返回它。有人可以向我解释为什么它会返回该值,以及我需要做什么来获取时间戳以与日志时间戳进行比较?

为了获得额外的荣誉,任何关于编码/风格的建议总是被赞赏和/或建议更好的方式来完成我正在做的事情。我看到的CSV文件相当大(〜8 MB)所以效率越高越好。

回答

0

看起来您正在为csv的每一行中的每列调用get_ts

而不是

for line in rows:        
    if get_ts(line) > log_datetime:     
     timeseries.append(line) 

尝试:

if get_ts(line[0]) > log_datetime:     
    timeseries.append(line) 
+0

谢谢,在我身上得到了正确的方向。 我结束了使用 'if get_ts(rows [0:19])> log_datetime: timeseries.append(rows)' 而且它读得恰到好处。现在我在阅读午夜时间戳的时候遇到了问题,只是日期'(2011/04/06)'而不是'(2011/04/06 00:00:00)',当我尝试比较时会抛出错误。 – qmoog 2012-08-16 16:57:40

+0

啊,关于我午夜的时间戳,看起来在从Windows中的Excel转换为GNU/Linux中的gedit或gnumeric时,午夜时间戳被截断。编辑回几个,它的工作原理应该如此。应该工作正常,因为我最终在Windows机器上使用它。 – qmoog 2012-08-16 17:10:48