Python:解析两个日期之间的CSV数据并按升序打印:
我对Python相当陌生,所以如果这个问题可能是一个简单的修复或错误,请原谅。如果你看下面的代码,我试图解析CSV文件中的数据。特别是,我试图以升序解析在两个日期之间创建的用户。在这两个日期之间创建的任何用户都应按升序打印出来。unix时间中的“我的日期”列Python:解析两个日期之间的CSV数据并按升序打印:,python,csv,datetime,parsing,Python,Csv,Datetime,Parsing,我对Python相当陌生,所以如果这个问题可能是一个简单的修复或错误,请原谅。如果你看下面的代码,我试图解析CSV文件中的数据。特别是,我试图以升序解析在两个日期之间创建的用户。在这两个日期之间创建的任何用户都应按升序打印出来。unix时间中的“我的日期”列行[1]。还有一个字列行[8]也应该打印出来。目标是当按升序解析日期时,打印的单词列行[8]形成一个特定短语。问题是,当我执行当前在Pycharm中的代码时,我在第15行creation\u date=date.fromtimestamp(i
行[1]
。还有一个字列行[8]
也应该打印出来。目标是当按升序解析日期时,打印的单词列行[8]
形成一个特定短语。问题是,当我执行当前在Pycharm中的代码时,我在第15行creation\u date=date.fromtimestamp(int(行[1]))处收到一个索引器:列表超出范围
。我知道Panda可以更好地处理CSV文件,但我尽量避免为这项任务学习Panda
import csv
from datetime import datetime, date
import sys
start_date = date(2014, 6, 22)
end_date = date(2014, 7, 22)
# Read csv data into memory filtering rows by the date in column 2 (row[1]).
csv_data = []
with open('sample.csv', newline='') as f:
reader = csv.reader(f, delimiter='\t')
header = next(reader)
csv_data.append(header)
for row in reader:
creation_date = date.fromtimestamp(int(row[1]))
if start_date <= creation_date <= end_date:
csv_data.append(row)
if csv_data: # Anything found?
# Print the results in ascending date order.
print(" ".join(csv_data[0]))
# Converting the timestamp to int may not be necessary (but doesn't hurt)
for row in sorted(csv_data[1:], key=lambda r: int(r[1])):
print(" ".join(row))
导入csv
从日期时间导入日期时间,日期
导入系统
开始日期=日期(2014年6月22日)
结束日期=日期(2014年7月22日)
#按第2列(第[1]行)中的日期将csv数据读入内存筛选行。
csv_数据=[]
将open('sample.csv',换行符='')作为f:
reader=csv.reader(f,分隔符='\t')
页眉=下一个(读卡器)
csv_data.append(标题)
对于读取器中的行:
创建日期=date.fromtimestamp(int(行[1]))
如果start_date看起来像是您试图访问的数据行中不存在的值(因为此行只有一个值)。
您可以将崩溃的代码包装为一个try/except
,然后查看失败的行:
for row in reader:
try:
creation_date = date.fromtimestamp(int(row[1]))
except IndexError:
print("Cannot get value for row: {}".format(row))
continue
if start_date <= creation_date <= end_date:
csv_data.append(row)
读取器中的行的:
尝试:
创建日期=date.fromtimestamp(int(行[1]))
除索引器外:
打印(“无法获取行:{}的值”。格式(行))
持续
如果开始日期您共享的日期用分隔,
。所以当你说
reader = csv.reader(f, delimiter='\t') // returns a single column
你应该把它换成
reader = csv.reader(f, delimiter=',')
实际代码:
import csv
from datetime import datetime, date
import sys
start_date = date(2014, 6, 22)
end_date = date(2014, 7, 22)
# Read csv data into memory filtering rows by the date in column 2 (row[1]).
csv_data = []
with open('sample_data.csv','r') as f:
reader = csv.reader(f, delimiter='\t')
header = next(reader)
csv_data.append(header)
for row in reader:
creation_date = date.fromtimestamp(int(row[1]))
if start_date <= creation_date <= end_date:
csv_data.append(row)
if csv_data: # Anything found?
# Print the results in ascending date order.
print(" ".join(csv_data[0]))
# Converting the timestamp to int may not be necessary (but doesn't hurt)
for row in sorted(csv_data[1:], key=lambda r: int(r[1])):
print(" ".join(row))
导入csv
从日期时间导入日期时间,日期
导入系统
开始日期=日期(2014年6月22日)
结束日期=日期(2014年7月22日)
#按第2列(第[1]行)中的日期将csv数据读入内存筛选行。
csv_数据=[]
将open('sample_data.csv','r')作为f:
reader=csv.reader(f,分隔符='\t')
页眉=下一个(读卡器)
csv_data.append(标题)
对于读取器中的行:
创建日期=date.fromtimestamp(int(行[1]))
如果开始日期,csv中的所有行是否都有两列?Madhan我通过Google Drive附加了一个指向csv文件的链接。[link]()不是一个真正的答案,而是了解更多问题的好方法,所以+1。但是,如果。。。append
部分应该在try块中(如果IndexError没有设置创建日期),谢谢你们,我已经尝试了这两个建议,我可以看到问题是Python无法获取第[1]行的值。即使在移动了if…..append语句之后,也要像erge所说的那样。我还尝试使用分隔符,但没有结果。它是在Excel中创建的标准分隔CSV文件。如果我使用\t分隔符,代码至少会尝试执行,但在Python尝试解析数据时,我仍然无法获得每行的值。我实际上已经解决了这个问题。你们让我走上了正确的道路。我必须将CSV文件的编码指定为utf8,并将分隔符改回“,”。现在我可以执行代码并得到我想要的结果了。谢谢你,Madhan,在其他两个人和你自己的帮助下。我有这个工作了!