文字中的数据格式,
2010-04-16,9:15:00,3450,3488,3450,3470
解析文字,
Utuple = collections.namedtuple('Utuple', 'DT,OpenPrice,ClosePrice,HighPrice,LowPrice')
stats = collections.Counter()
for line in data.readlines():
cols = line.split(',')
Date = cols[0]
d = Date.split('-')
Time = cols[1]
t = Time.split(':')
DT = datetime(int(d[0]), int(d[1]), int(d[2]), int(t[0]), int(t[1]), int(t[2]))
DT = mdates.date2num(DT)
OpenPrice = float(cols[2])
HighPrice = float(cols[3])
LowPrice = float(cols[4])
ClosePrice = float(cols[5])
stats[DT] = Utuple(DT,OpenPrice,ClosePrice,HighPrice,LowPrice)
我想得到一个元组列表,以符合matplotlib.finance中candlesticks
的格式,预计将是
D = [(datetime.datetime(2010, 4, 16, 9, 30), 311, 332, 344, 311),
(datetime.datetime(2010, 4, 16, 9, 31), 312, 332, 344, 311),
(datetime.datetime(2010, 4, 16, 9, 32), 323, 332, 344, 320),
(datetime.datetime(2010, 4, 16, 13, 0), 331, 332, 344, 330),
(datetime.datetime(2010, 4, 16, 13, 1), 335, 342, 348, 333)]
我做了:
formated_data = []
for time, index in stats.items():
formated_data.append(tuple(index))
我想保留此订单。但在formated_data
中,事实证明,datetime.datetime第四列中13
的行最终位于9
的前面。如何保持元组by the order that I save them
或the value of the number (9 < 13)
的顺序?
答案 0 :(得分:2)
您必须对结果列表进行排序。迭代器stats.items()
不保证项目顺序。
或者,您可以通过
迭代键for time in sorted(stats.keys()):
formatted_data.append(tuple(stats[time]))
答案 1 :(得分:2)
首先是另一种解析文本的方法
2010-04-16,9:15:00,3450,3488,3450,3470
基本上是
date,time,openprice,closeprice,highprice,lowprice
并进一步细分为
YYYY-MM-DD,HH:MM:SS,openprice,closeprice,highprice,lowprice
这转化为正则表达式:
r='(\d+)-(\d+)-(\d+),(\d+):(\d+):(\d+),(\d+),(\d+),(\d+),(\d+)
可用于生成元组
tuple = re.search(r, my_date_string).groups()
您的问题:为什么商品按特定顺序排列
当您将其插入到集合中时,不再对其进行排序。可以想象这就是将大量的糖果放入糖果袋中。这个包有黑色外观。
迭代器的作用是,它一次取出一个糖果。您可能拥有的任何优先品(如味道,气味,大小)都无关紧要。唯一能做的就是迭代器首先要输出的东西。
重新:您的评论
您的意思是您所阅读的数据格式与您希望的格式不同,因此您想重新排序元组以反映您认为合理的顺序吗?
如果是这种情况,正则表达式将保持不变:) 但是,您只需为变量分配其他索引。
这可以在python中非常优雅地完成(准备坠入爱河):
date,time,openprice,highprice,lowprice,closeprice = tuple #temporarily store them
tuple = date,time, openprice,closeprice,highprice,lowprice #reorder the tuple
如果您认为我错误地解释了原始数据,则根据需要重新排序前两个代码行中的第一个。我承认我对你正在做什么样的应用程序知之甚少,因此不知道不同的变量意味着什么。
哦,如果你想知道我是如何做到这一点的,那就很简单了。逗号是python中的元组解包操作符。
>>>tuple = ('a', 'b' , 'c')
>>>first,second,third = tuple
>>>first
'a'
依此类推:))
答案 2 :(得分:0)
collections.Counter
基于字典,不保留顺序(“A Counter是dict子类”)
有an example in the collections
docs,其中显示了如何合并collections.OrderedDict
和collections.Counter
,这应该做你想做的事情:
from collections import Counter, OrderedDict
class OrderedCounter(Counter, OrderedDict):
'Counter that remembers the order elements are first encountered'
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__, OrderedDict(self))
def __reduce__(self):
return self.__class__, (OrderedDict(self),)
然后将stats = collections.Counter()
更改为stats = OrderedCounter()