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))

この順番を守りたい。しかし、では、datetime.datetimeの4番目の列formated_dataの行が。の行の前に表示されることがわかります。タプルの順序を維持する方法またはによって?139by the order that I save themthe 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()

あなたの質問:なぜアイテムが特定の順序で出てくるのですか?

これをコレクションに挿入すると、これはソートされなくなります。これは、たくさんのキャンディーをキャンディーバッグに入れることと考えてください。バッグの外面は黒です。

イテレータが行うことは、一度に1つのキャンディーを取り出すことです。あなたが持っているかもしれないどんな好み(味、匂い、サイズなど)も重要ではありません。実行するのは、イテレータが最初に出力することを好むものだけです。

Re:あなたのコメント

読み取ったデータが希望する形式とは異なる形式であるため、適切と思われる順序を反映するようにタプルを並べ替えたいということですか?

その場合、正規表現は同じままです:)ただし、変数に他のインデックスを割り当てるだけです。

これはPythonで非常にエレガントに行うことができます(恋に落ちる準備をしてください):

date,time,openprice,highprice,lowprice,closeprice = tuple #temporarily store them
tuple = date,time, openprice,closeprice,highprice,lowprice #reorder the tuple

元のデータを誤って解釈したと思われる場合は、必要に応じて前の2つのコードラインの最初のコードを並べ替えてください。私はあなたがどのような種類のアプリケーションを作成しているのかについてあまり知識がないことを認めます。したがって、さまざまな変数が何を意味するのかわかりません。

そして、ああ、あなたが私がこの魔法をどのようにしたのか疑問に思っているなら、それは非常に簡単です。コンマは、Pythonのタプル解凍演算子です。

 >>>tuple = ('a', 'b' , 'c')
 >>>first,second,third = tuple
 >>>first
    'a'

等々 :)

于 2012-07-12T12:27:48.480 に答える
0

これcollections.Counterは、順序を保持しない辞書に基づいています(「カウンターはdictサブクラスです」)

ドキュメントには、を組み合わせる方法と、必要なことを実行する方法を示すcollectionsがあります。collections.OrderedDictcollections.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 に答える