我正在尝试对CSV文件进行排序,我希望按日期按相反的顺序对项目进行排序:最新的。
def SortCsvByField( filename, fieldNo, sep = ',' ):
records = [line.split(sep) for line in file(filename)]
就这一点而言,这很容易,但我如何比较日期呢?
答案 0 :(得分:5)
我建议安装优秀的dateutil模块。 (在Ubuntu / Debian中,它由python-dateutil包提供)。
dateutil可以将日期字符串解析为datetime对象:它可以处理许多不同的日期格式而无需抬起手指(*):
import dateutil.parser as dparser
date=dparser.parse("Mon May 7 1883 10:36:28")
print(date)
# 1883-05-07 10:36:28
date=dparser.parse("1685-3-21")
print(date)
# 1685-03-21 00:00:00
date=dparser.parse("12/17/1770")
print(date)
# 1770-12-17 00:00:00
请注意,解析将“12/17/1770”解释为“MM / DD / YYYY”形式。您可以使用解析的dayfirst
和yearfirst
选项更改此行为。 (见http://labix.org/python-dateutil)
print(type(date))
# <type 'datetime.datetime'>
日期时间对象可以轻松排序:
dates=[dparser.parse("Mon May 7 1883 10:36:28"),dparser.parse("1685-3-21"),dparser.parse("12/17/1770"),]
dates.sort()
print(dates)
# [datetime.date(1685, 3, 21), datetime.date(1770, 12, 17), datetime.date(1833, 5, 7)]
如果您不想安装dateutil软件包,那么您将会这样做 必须推出自己的方法将日期字符串转换为datetime对象。这需要更多的工作,因为您必须定义格式。下面,'%Y-%m-%d'定义YYYY-MM-DD格式。有关可用格式代码的详细信息,请参阅http://au2.php.net/strftime(或strftime的手册页)。
例如,
dates=[datetime.datetime.strptime(date_str,'%Y-%m-%d') for date_str in
('1883-5-7','1685-3-21','1770-12-17',)]
print([str(date) for date in dates])
# ['1883-05-07 00:00:00', '1685-03-21 00:00:00', '1770-12-17 00:00:00']
dates.sort()
print([str(date) for date in dates])
# ['1685-03-21 00:00:00', '1770-12-17 00:00:00', '1883-05-07 00:00:00']
要在将datetime对象转换回可打印字符串时控制格式,可以使用datetime.datetime.strftime()方法。
答案 1 :(得分:2)
如果您的日期是ISO-8601格式(YYYY-MM-DD),那么您可以将它们排序为字符串,否则您必须先解析它们(datetime.strptime)。
然后,如果日期是第二个字段,则可以使用例如sorted(records, key=lambda a:a[1])
进行排序。
答案 2 :(得分:2)
假设您知道日期的格式,并且它们位于CSV文件的第1列中:
>>> import csv
>>> from datetime import datetime
>>> def date_key(row):
return datetime.strptime(row[1].strip(), "%m/%d/%Y")
>>> with open('c:\\temp\\test\\date_test.csv', 'rb') as f:
data = list(csv.reader(f))
>>> data
[['foo', ' 3/11/2004'], ['bar', ' 2/15/2001'], ['baz', '11/15/2007'], ['bat', '10/13/2002']]
>>> data.sort(key=date_key)
>>> data
[['bar', ' 2/15/2001'], ['bat', '10/13/2002'], ['foo', ' 3/11/2004'], ['baz', '11/15/2007']]