2

文本中的数据格式,

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)

我想获得一个元组列表以适应candlesticksmatplotlib.finance 中的格式,预计为

  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,事实证明,13datetime.datetime 中第四列中带有 的行最终位于带有 的行的前面9。如何保持元组的顺序by the order that I save them或按顺序the value of the number (9 < 13)

4

3 回答 3

2

您必须对结果列表进行排序。迭代器stats.items()不保证项目顺序。

或者,您可以通过以下方式迭代密钥

for time in sorted(stats.keys()):
    formatted_data.append(tuple(stats[time]))
于 2012-07-12T11:11:59.213 回答
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'

等等 :)

于 2012-07-12T12:27:48.480 回答
0

基于collections.Counter字典,它不保留顺序(“A Counter is a dict subclass”)

文档中有一个示例,collections它显示了如何组合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()

于 2012-07-13T12:26:58.667 回答