我正在编写一个将大型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)所以效率越高越好。
谢谢,在我身上得到了正确的方向。 我结束了使用 '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
啊,关于我午夜的时间戳,看起来在从Windows中的Excel转换为GNU/Linux中的gedit或gnumeric时,午夜时间戳被截断。编辑回几个,它的工作原理应该如此。应该工作正常,因为我最终在Windows机器上使用它。 – qmoog 2012-08-16 17:10:48