Python:解析两个日期之间的CSV数据并按升序打印:

Python:解析两个日期之间的CSV数据并按升序打印:,python,csv,datetime,parsing,Python,Csv,Datetime,Parsing,我对Python相当陌生,所以如果这个问题可能是一个简单的修复或错误,请原谅。如果你看下面的代码,我试图解析CSV文件中的数据。特别是,我试图以升序解析在两个日期之间创建的用户。在这两个日期之间创建的任何用户都应按升序打印出来。unix时间中的“我的日期”列行[1]。还有一个字列行[8]也应该打印出来。目标是当按升序解析日期时,打印的单词列行[8]形成一个特定短语。问题是,当我执行当前在Pycharm中的代码时,我在第15行creation\u date=date.fromtimestamp(i

我对Python相当陌生,所以如果这个问题可能是一个简单的修复或错误,请原谅。如果你看下面的代码,我试图解析CSV文件中的数据。特别是,我试图以升序解析在两个日期之间创建的用户。在这两个日期之间创建的任何用户都应按升序打印出来。unix时间中的“我的日期”列
行[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,在其他两个人和你自己的帮助下。我有这个工作了!