我有一个与此类似的列表
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 ...)创建图表。绘制数据而不对其进行排序会令人困惑。
答案 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