【问题标题】:Sorting csv column by date按日期对csv列进行排序
【发布时间】:2014-07-06 22:10:59
【问题描述】:

我有一个类似的列表

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...),还是在将其附加到列表之前对其进行排序?

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

【问题讨论】:

  • 好吧,您可以将日期放入列表中,然后对列表进行排序。

标签: python sorting csv


【解决方案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)并取 0th 元素 - 根据 Jons 的评论,我们可以将其限制为只有 1 个拆分,因为我们只有第一列.
  • .split("/") - split / 上的第 0th 元素作为日期
  • )[::-1])) - 使用数组切片反转列表,因此是年、月、日

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

为简洁起见,如果您再也不会使用 firstItemDate 函数,您可以将其插入到 sorted 调用中,如下所示:

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

【讨论】:

  • @LegoStormtroopr 出于某种原因,我得到了“记录”对象没有属性“拆分”错误。为什么会这样?
【解决方案2】:

您可以使用 pandas 轻松做到这一点:

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

【讨论】:

  • 对于数组排序这样简单的事情,无需安装和导入庞大的 3rd 方库。
  • @Lego 虽然没有必要...... OP 的措辞方式暗示了暗示一些数据分析的问题,pandas 并不是对这些事情的不合理建议......跨度>
  • @Lego 当然,但正如 Jon 指出的那样,如果涉及任何其他分析,从长远来看,pandas 可能会节省大量精力。另外,很多人已经(在不知不觉中)安装了 pandas,例如,如果他们正在运行通过 Anaconda 或其他包获得的 Python。
猜你喜欢
  • 2010-12-18
  • 2012-04-12
  • 2021-09-07
  • 2011-01-07
  • 2019-08-23
  • 1970-01-01
  • 2020-10-30
相关资源
最近更新 更多