に基づいて、私は次のようになりますデータフレームを持っています。合計日時の違いは、列値
field 1
およびfield 2
は、タプル(field1,field2)
が世界のどこかの特定のセンサーに対応するように項目を識別するために使用されます。 field 3
は、その時点のそのセンサーの値であり、値0または1のいずれかをとります。
私はグループにデータフレームを(field1、field2)とし、各センサーが各値だから、フィールド3から、t1='2016-07-20 00:00:00'
場合とt2='2016-07-20 00:01:00'
、現在の時刻が'2016-07-20 00:03:00'
で、私がどのように見える新しいデータフレームだろう:
field3=0 field3=1
(1,1) 2 min 1 min
(2,3) ... ...
(3,3) ... ...
(1,2) ... ...
を私は、t1
からt2
に、field3
の値が1であると仮定しますt2
以降は、(1,1)がデータフレームに再び表示されないため、0になります。 1 min
はt2 - t1
からのものであり、2 min
は、以下のいずれかの形式(何も合計分/秒で、timedelta、またはことが)
私が試したことができcurrent_time - t2
2 min
と1 min
からです。
import pandas as pd
from collections import defaultdict, namedtuple
# so i can create a defaultdict(Field3) and save some logic
class Field3(object):
def __init__(self):
self.zero= pd.Timedelta('0 days')
self.one = pd.Timedelta('0 days')
# used to map to field3 in a dictionary
Sensor = namedtuple('Sensor','field1 field2')
# the dataframe mentioned above
df = pd.DataFrame(...)
# iterate through each row of the dataframe and map from (field1,field2) to
# field3, adding time based on the value of field3 in the frame and the
# time difference between this row and the next
rows = list(df.iterrows())
sensor_to_field3 = defaultdict(Field3)
for i in xrange(len(rows)-1):
sensor = Sensor(field1=rows[i][1][0],field2=rows[i][1][1])
if rows[i][1][2]: sensor_to_field3[spot].one += rows[i+1][0]-rows[i][0]
else: spot_to_status[spot].zero += rows[i+1][0]-rows[i][0]
spot_to_status = {k:[v] for k,v in sensor_to_field3.iteritems()}
result = pd.DataFrame(sensor_to_field3,index=[0])
私は基本的には私を得ていますが(現在のところ、この問題を解決するより良い方法があれば、本当に対処しなければならないテーブル全体に単一のセンサーが表示されている場合にのみ動作します) 。
これについてもっと良い方法があるように感じます。何かのグループウェアをfield1,field2
にしてから、field3
とtime
というインデックスに基づいてtimedeltasを集計しますが、その方法についてはわかりません。