我有一个包含大约25000行和10列数据的文本文件,包括一列日期和一组与这些日期相关的数据(格式为yyyymmdd)。它采用以下格式:
<div ng-controller="mainCtrl" ng-class="{true: 'grey'}[madeCall]">
我想要得到它所以1月1日的所有日子都在一起,1月2日的所有日子都在一起,等等剩下的时间。那就是:
19500101 20.7
19500102 19.9
19500103 -77.1
19500104 -1.2
如何使用python重新排列文本文件以获取此格式?
答案 0 :(得分:1)
您可以将数据读入列表,每行都是列表中的字符串。然后使用仅查看日期的mmdd
部分的键函数对列表进行排序。
这里有一些代码使用硬编码列表来说明这个想法,但是您应该很容易对其进行调整以读取文件中的行。
data = '''
19500101 20.7
19500102 19.9
19500103 -77.1
19500104 -1.2
19510101 230.1
19520101 -91.8
19530101 20.0
'''.splitlines()[1:]
def keyfunc(line):
return line.split(None, 1)[0][4:]
data.sort(key=keyfunc)
for row in data:
print row
<强>输出强>
19500101 20.7
19510101 230.1
19520101 -91.8
19530101 20.0
19500102 19.9
19500103 -77.1
19500104 -1.2
这是一个更为关键的功能:
def keyfunc(line):
date = line.split(None,1)[0]
return date[4:], date[:4]
如果两个项目具有相同的mmdd
,则会在yyyy
上对它们进行比较,以便将具有相同mmdd
的所有项目组合在一起但在群组中它们会被组合在一起也按年份排序。
line.split(None,1)[0]
获取该行的日期部分。您可以只使用line.split()[0]
来执行相同的操作,但效率较低,因为它必须将整行拆分为单独的列,而我们只需要第一列为我们的钥匙。
答案 1 :(得分:0)
执行此操作的一种方法是使用日期作为键来设置字典,并将元素附加到每个键的列表中。然后设置输出,遍历日期并获取每个日期的列表(作为键),并以您想要的格式输出列表中的元素。
如果您打印列表中的每个元素,并且该元素的键(您已经知道)作为第一个项目而元素作为第二个项目,您将拥有它。或者,您可以按问题How can I sort a dictionary by key?中所示对字典进行排序。
一个例子是
for key in sorted(mydict):
for elem in mydict[key]:
print "%s: %s" % (key, elem)
由于mydict [key]是一个列表,你可以将其作为
来处理{{1}}
答案 2 :(得分:0)
实现它的一种方法是将日期转换为(日,月,年)的元组,然后按它排序。喜欢这样的事情应该这样做:
def date_as_tuple(date):
return (int(date[6:8]), int(date[4:6]), int(date[0:4]))
lines = open("file", "r").readlines()
lines.sort(key=lambda line: date_as_tuple(line.split()[0]))
print "".join(lines)
答案 3 :(得分:0)
循环显示文本文件,创建一个词典列表,然后在下面继续!
import datetime
data = [{'date':'2015-01-10','Info':'b'}, #Default data layout
{'date':'2015-01-01','Info':'a'},
{'date':'2016-01-01','Info':'d'},
{'date':'2015-10-01','Info':'c'}]
#Then using the sort method, sort the data in a YMD format
data.sort(key=lambda x: datetime.datetime.strptime(x['date'], '%Y-%M-%d'))
#Now just loop through list writing each index back to file!!!