从列表切片获取时间戳时发生Python错误
我正在编写一个脚本,将一个大的CSV文件分块成更小的分块文件。它交叉引用一个日志文件,该文件保存最后一个分块的时间戳,因此只写入/分块晚于记录时间的时间戳 csv文件的第一列具有时间戳,其格式为从列表切片获取时间戳时发生Python错误,python,datetime,csv,slice,Python,Datetime,Csv,Slice,我正在编写一个脚本,将一个大的CSV文件分块成更小的分块文件。它交叉引用一个日志文件,该文件保存最后一个分块的时间戳,因此只写入/分块晚于记录时间的时间戳 csv文件的第一列具有时间戳,其格式为%Y%m%d%H%m%S格式。CSV文件还有四行我不想/不需要的头信息,ts_pre子句中的行会删除这些信息 log\u lookup()。显然,我正在与六个不同的电台合作,它们都有不同的信息列,只是它们都共享我在第二段中描述的相同结构 部分脚本是: import csv, sys, datetime
%Y%m%d%H%m%S
格式。CSV文件还有四行我不想/不需要的头信息,ts_pre子句中的行会删除这些信息
log\u lookup()。显然,我正在与六个不同的电台合作,它们都有不同的信息列,只是它们都共享我在第二段中描述的相同结构
部分脚本是:
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作为占位符。(很明显我不是程序员吗?)
示例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文件非常大(~8MB),因此效率越高越好 看起来您正在为csv的每一行中的每一列调用get\ts
而不是
for line in rows:
if get_ts(line) > log_datetime:
timeseries.append(line)
尝试:
谢谢,这让我走上了正确的方向。最后,我使用了if-get\ts(rows[0:19])>log\u-datetime:timeseries.append(rows)
,它读得恰到好处。现在我遇到了一个问题,读者将午夜时间戳读取为日期(2011/04/06)
,而不是(2011/04/06 00:00)
,这会在我尝试比较时抛出错误。啊,关于我在午夜的时间戳,当从Windows中的Excel转换为GNU/Linux中的gedit或gnumeric时,午夜时间戳被截断了。在几分钟内重新编辑,它的工作原理与它应该的一样。应该可以正常工作,因为我最终会在Windows机器上使用它。
for line in rows:
if get_ts(line) > log_datetime:
timeseries.append(line)
if get_ts(line[0]) > log_datetime:
timeseries.append(line)