两列 CSV 数据排序 - 一列 str(升序)另一列 date(降序)

Posted

技术标签:

【中文标题】两列 CSV 数据排序 - 一列 str(升序)另一列 date(降序)【英文标题】:Two column CSV data sort - one column str(ascending) the other column date(descending) 【发布时间】:2012-11-25 05:13:15 【问题描述】:

我有兴趣了解如何对 CSV 文件执行两列排序,其中一列升序,另一列降序,需要解析为可理解的日期格式。

import operator
import csv
import dateutil.parser as dparser

reader = csv.reader(open("2002_NASDAQ.csv"), delimiter=",")

sortedlist = sorted(reader, key=lambda k: (k[0], dparser.parse(k[1])), reverse=True)

with open('2002_NASDAQ_out.csv', 'wb') as f:
    csv.writer(f).writerows(sortedlist)

如果我删除解析,脚本运行时不会出错。但是,如果没有正确格式的日期,结果将无法达到预期(股票升序、日期降序)。

''' Sample sample.csv data
AAME,01-Jan-2002,2.204,2.204,2.204,2.204,0
AAON,01-Jan-2002,7.254,7.254,7.254,7.254,0
AAPL,01-Jan-2002,10.95,10.95,10.95,10.95,0
AAME,02-Jan-2002,5.71,5.71,5.71,5.71,0
AAON,02-Jan-2002,11.125,11.125,11.125,11.125,0
AAPL,02-Jan-2002,13.85,13.85,13.85,13.85,0
AAME,03-Jan-2002,28.82,28.82,28.82,28.82,0
AAON,03-Jan-2002,15.82,15.82,15.82,15.82,0
AAPL,03-Jan-2002,1.725,1.725,1.725,1.725,0
AAME,04-Jan-2002,5.3333,5.3333,5.3333,5.3333,0

''' Example sorted.csv data
AAME,04-Jan-2002,5.3333,5.3333,5.3333,5.3333,0
AAME,03-Jan-2002,28.82,28.82,28.82,28.82,0
AAME,02-Jan-2002,5.71,5.71,5.71,5.71,0
AAME,01-Jan-2002,2.204,2.204,2.204,2.204,0
AAON,03-Jan-2002,15.82,15.82,15.82,15.82,0
AAON,02-Jan-2002,11.125,11.125,11.125,11.125,0
 .
 .
 .
AAPL,03-Jan-2002,1.725,1.725,1.725,1.725,0
'''

【问题讨论】:

【参考方案1】:

传统的做法是依靠Python的排序是稳定的,排序两次(注意先做第二个key):

a = sorted(something, key=itemgetter(1), reverse=True)
a.sort(key=itemgetter(0))

示例

>>> a = [ (1, 2), (0, 1), (2, 1), (2, 7) ]
>>> a.sort(key=itemgetter(1), reverse=True)
>>> a.sort(key=itemgetter(0))
>>> a
[(0, 1), (1, 2), (2, 7), (2, 1)]

未经测试

sortedlist = sorted(reader, key=lambda L: dparser.parse(L[1]), reverse=True)
sortedlist.sort(key=itemgetter(0))

【讨论】:

乔恩,感谢您的回复。我明白其中的逻辑。当我实现它时,我从 dpaser.parse 行收到一个 Unknown String 错误。 这里是抛出的错误: sortedlist = sorted(reader, key=lambda L: dparser.parse(L[1]), reverse=True) File "C:\pysci17\lib\site -packages\dateutil\parser.py”,第 697 行,在解析中返回 DEFAULTPARSER.parse(timestr, **kwargs) 文件“C:\pysci17\lib\site-packages\dateutil\parser.py”,第 303 行,在解析引发ValueError,“未知字符串格式”ValueError:未知字符串格式 我无法让同一脚本中的两种排序正常运行。但是,在我将它们放在单独的脚本中之后,逻辑按预期完美运行。上面的一个场合我引用了错误的元素。更正该问题后,程序运行没有错误,但随后创建了一个 0 字节的 outfile 文件。

以上是关于两列 CSV 数据排序 - 一列 str(升序)另一列 date(降序)的主要内容,如果未能解决你的问题,请参考以下文章

如何将一列中的两列合并为日期与熊猫?

EXCEL如何把第二列的数据按照第一列数据排序,且第二列的数据少于第一列?

如何在excel中将两列对应的数据以其中一列的排序 求教各位高手

sql查询并新增一列,按条件排序后给这一列赋值,并满足条件按序列赋值

excel两列数据中如何找出相同的数据并对应排列

如何在熊猫中将一列拆分为两列