按日期排序csv列

时间:2014-05-19 03:52:52

标签: python sorting csv

我有一个与此类似的列表

Date,dataA,dataB,dataC,dataD,dataE
1/1/2013,45.817,0.000,0.352,5.880,39.585
2/1/2013,21.154,0.000,0.348,6.562,14.244
3/1/2013,16.901,0.000,0.344,4.765,11.792
4/1/2013,54.324,1.051,7.597,10.896,34.780
5/1/2013,45.223,1.483,0.379,7.602,35.759
6/1/2013,25.140,1.336,0.402,5.678,17.724
...

一直到2013年12月31日。

这是我的代码:

for row in data:
    row[0]=row[0].strftime('%d/%m/%y')
    month=int(row[0].split('/')[1])
    if month== 1:
        print (row[0])

输出:

01/01/13
13/01/13
14/01/13
15/01/13
16/01/13
17/01/13
18/01/13
19/01/13
20/01/13
21/01/13
22/01/13
23/01/13
24/01/13
25/01/13
26/01/13
27/01/13
28/01/13
29/01/13
30/01/13
31/01/13
02/01/13
03/01/13
04/01/13
05/01/13
06/01/13
07/01/13
08/01/13
09/01/13
10/01/13
11/01/13
12/01/13

我的问题是如何对列表进行排序以使其按顺序排列(01/01 / 2013,02 / 01/2013 ...),或者在将其附加到列表之前对其进行排序?

我想要的是使用数据(列之一)为单个选定月份(例如jan / feb ...)创建图表。绘制数据而不对其进行排序会令人困惑。

2 个答案:

答案 0 :(得分:1)

Sorting of lists accepts a key parameter指示如何对列表中的项目进行排序。唯一的挑战是基于日期而不是简单的比较器。

firstItemDate = lambda x:date(*map(int,(x.split(",",1)[0].split("/"))[::-1]))
print sorted(data[1:],key=firstItemDate)

密钥firstItemDate可以像这样分解:

  • lambda x: - 一个带参数的匿名函数(数组的每一行)
  • date( - 创建一个datetime.date对象(这需要3个参数)
  • * - unpack the argument list进入date函数
  • map(int,( - map一个函数,在这种情况下int转换为列表
  • x.split(",",1)[0] - split逗号的行(作为csv)并取0 th 元素 - 根据Jons评论我们可以将其限制为1因为我们只是第一列。
  • .split("/") - split /上的0 th 元素作为其日期
  • )[::-1])) - 使用数组切片反转列表,使其年,月,日

由于日期对象定义了它们的排序方式,因此这将确保日期有效并正确排序。

为简洁起见,如果您再也不会使用firstItemDate功能,可以将其插入sorted来电,如下所示:

print sorted(data[1:],key=lambda x:date(*map(int,(x.split(",")[0].split("/"))[::-1])))

答案 1 :(得分:0)

你可以用熊猫轻松地做到这一点:

import pandas as pd

header = data.pop(0)
df = pd.DataFrame(data, columns=header)
print df.sort('Date')

输出:

       Date   dataA  dataB  dataC   dataD   dataE
0  1/1/2013  45.817  0.000  0.352   5.880  39.585
1  2/1/2013  21.154  0.000  0.348   6.562  14.244
2  3/1/2013  16.901  0.000  0.344   4.765  11.792
3  4/1/2013  54.324  1.051  7.597  10.896  34.780
4  5/1/2013  45.223  1.483  0.379   7.602  35.759
5  6/1/2013  25.140  1.336  0.402   5.678  17.724