2

私はジャンゴモデルを持っています:

class Measurement(models.Model):
   """
   Saves the measurment data for every subdevice
   """
   node = models.ForeignKey('Node', related_name='measurements')
   value = models.CharField(_(u'Value'), max_length=255)
   begin = models.DateTimeField(editable=True)
   end = models.DateTimeField(editable=True)

現在、値は True/False または 00123 のような数値です。次に、csv テーブルを作成します。

Day, Time, node1, node2, node3
1, 00:00, 0, 1, 0
1, 00:05, 0, 1, 1
1, 00:10, 1, 0, 0
...
7, 24:00, 0, 0, 0

ノードは、テレビやデスクトップ ライトのようなアプライアンスです。値 (0/1) は、アプライアンスがオンになっているかどうかを定義します。開始/終了は次のようになります。

begin: 2012-12-01 00:00:00, end: 2012-12-01 08:32:33

ここで知りたいのは、時刻/日付の値を確認する方法です: 2012-12-01 at 00:30 ? 可能な時間を含むリストを作成しますか?

times = [00:00, 00:05, ... 12:00, 12:05, ... 23:50, 23:55, 24:00]

それを反復して、アイテムが開始または終了にあるかどうかを確認しますか? これを達成するにはどうすればよいですか?

4

1 に答える 1

0

きれいな方法で時間間隔を反復するのは簡単です。次のようなイテレータ関数を書くことができます:

def itertime(start, end, int_step):
    current_time = start
    step = datetime.timedelta(0, int_step)
    while current_time < end:
        yield current_time
        current_time += step

ステートメントで使用して、forCSV ファイルの各行の時間測定値を取得します。

for time in itertime(start_time, end_time, step=5 * 60):
     ...

さて、あなたが必要としているのはそれほど単純ではありません - それはトリッキーで、「昔のことを考えなければならない問題」のようなものです。しかし、達成しなければならないステップを要約してみましょう。私はそれをコーディングすることはできません, または私は明らかにあなたのために働いているだろう, Pythonはそれを招待すると思った

Read all the measurements you want to take in account 
(use a simple query like Measurement.objects.filter(end__gte=begin_time,
     begin__lte=end_time) )
get all the nodes in your query
for each node:     
    - get the initial state of each node at "begin_time" and annotate it in
       a dictionary with the current state of each node
    - calculate a "next_change" time in each node - determine the time
        of next state change (either its begin, or its end, if the begin is in the past)
    - push then into a n ordered data structure, such as a list 
          maintained with Python's heapq based on this 
          next_state_change" time-stamp

Then start your CSV files, with headers and first value line (from the dictionary
         with the current state)
Loop through your time stamps along the snippet above, and for
               each timestamp:
      - pick measurements from your list until "nest_state_change" is
              after your timestamp. For each of them:
            - if "end" is in the future, annotate that as "next_state_change" and 
                  push it back on the heapq
            - update the device state on your nodes dictionary
      - write a new row to your CSV file

そして、それはそれについてです。ここで私の答えを確認してください: Pythonのheapqを使用する実用的な方法については、カスタム比較述語を使用したheapq

于 2013-03-12T13:13:26.737 に答える