按日期和时间对数据进行排序python

时间:2020-12-23 20:10:53

标签: python sorting dictionary grouping

我的数据在 txt 文件中。

1   B   F   2019-03-10 
1   C   G   2019-03-11 
1   B   H   2019-03-10 
1   C   I   2019-03-10 
1   B   J   2019-03-10 
2   A   K   2019-03-10 
1   D   L   2019-03-10 
2   D   M   2019-03-10 
2   E   N   2019-03-11 
1   E   O   2019-03-10 

我需要做的是根据第一列拆分数据。

因此,第一列中编号为 1 的所有行都转到一个列表(或字典或其他任何内容),而第一列中编号为 2 的所有行都转到其他列表或其他列表中。这是一个样本数据,在原始数据中我们不知道第一列有多少个不同的数字。

接下来我要做的是按日期和时间对每个键(在我的例子中是数字 1 和 2)的数据进行排序。我可以用 data.txt 做到这一点,但不能用字典。

with open("data.txt") as file: 
    reader = csv.reader(file, delimiter="\t")
    data=sorted(reader, key=itemgetter(0))
    lines = sorted(data, key=itemgetter(3))

lines

OUTPUT:
[['1', 'B', 'F', '2019-03-10'],
 ['2', 'D', 'M', '2019-03-10'],
 ['1', 'B', 'H', '2019-03-10'],
 ['1', 'C', 'I', '2019-03-10'],
 ['1', 'B', 'J', '2019-03-10'],
 ['1', 'D', 'L', '2019-03-10'],
 ['2', 'A', 'K', '2019-03-10'],
 ['1', 'E', 'O', '2019-03-10'],
 ['1', 'C', 'G', '2019-03-11'],
 ['2', 'E', 'N', '2019-03-11']]

所以我需要的是按第一列中的数字对数据进行分组,并按日期和时间对其进行排序。谁能帮我以某种方式组合这两个代码?我不确定我是否必须使用字典,也许还有另一种方法可以做到这一点。

2 个答案:

答案 0 :(得分:1)

按照第一列拆分数据后,可以对每个key对应的list进行排序

def sort_by_time(key_items):
    return sorted(key_items, key=itemgetter(3))

d = {k: sort_by_time(v) for k, v in d.items()}

如果 d 有单独的时间和日期元素,那么您可以按几列排序:

sorted(key_items, key=itemgetter(2, 3))

答案 1 :(得分:1)

itertools.groupby 可以帮助构建列表:

from operator import itemgetter
from itertools import groupby
from pprint import pprint

# Read all the data splitting on whitespace
with open('data.txt') as f:
    data = [line.split() for line in f]

# Sort by indicated columns
data.sort(key=itemgetter(0,3,4))

# Build a dictionary keyed on the first column
# Note: data must be pre-sorted by the groupby key for groupby to work correctly.
d = {group:list(items) for group,items in groupby(data,key=itemgetter(0))}

pprint(d)

输出:

{'1': [['1', 'B', 'F', '2019-03-10', '16:13:38.935'],
       ['1', 'B', 'H', '2019-03-10', '16:13:59.045'],
       ['1', 'C', 'I', '2019-03-10', '16:14:07.561'],
       ['1', 'B', 'J', '2019-03-10', '16:14:35.371'],
       ['1', 'D', 'L', '2019-03-10', '16:14:40.854'],
       ['1', 'E', 'O', '2019-03-10', '16:15:05.878'],
       ['1', 'C', 'G', '2019-03-11', '16:14:39.999']],
 '2': [['2', 'D', 'M', '2019-03-10', '16:13:58.641'],
       ['2', 'A', 'K', '2019-03-10', '16:14:43.224'],
       ['2', 'E', 'N', '2019-03-11', '16:15:01.807']]}