2010-08-13 27 views
2

我有一個相當獨特的問題,我試圖解決:使用日期和時間分析數據對象

基於此樣本數據(實際數據是非常多的記錄,每卡每日至少4):

serial, card, rec_date, rec_time, retrieved_on 
2976 00040 2010-07-29 18:57 2010-07-31 13:37:31 
2977 00040 2010-07-30 09:58 2010-07-31 13:37:31 
2978 00040 2010-07-30 15:33 2010-07-31 13:37:31 
2979 00040 2010-07-30 16:13 2010-07-31 13:37:31 
2980 00040 2010-07-30 19:41 2010-07-31 13:37:31 

記錄來自時鐘系統。

我想要做的就是把一組特定的條目,由cardrec_date過濾,然後確定多久的人已經在白天和每個workspan的長度,有多少休息,他/她已經工作,並在本週結束時獲得工作的總小時數。

從上面的列表中,2977是檢入,然後2978是檢出等。

我迷失在如何做到這一點,所以我想這裏有人會有一個想法。

我用一個簡單的類從其他地方進口否則以後這個數據存儲:

class TimeClock(models.Model): 
    serial = models.CharField(max_length = 16) 
    card_no = models.CharField(max_length = 10) 
    rec_date = models.DateField() 
    rec_time = models.TimeField() 
    oper_date = models.DateTimeField(default=datetime.today) 
+0

你怎麼知道是否有退房和入住?您是否假設在辦理登機手續後始終退房? – 2010-08-13 18:33:44

+0

這也是一個棘手的部分...我想有人可能會錯過辦理登機手續我們的退房......但理想的情況是,退房總是在辦理登機手續後。如果總條目很奇怪,我已經創建了一個允許添加條目的視圖 – Stephen 2010-08-13 18:37:08

+0

您提到了Django,但並未真正說明數據的結構。這些記錄是否在模型中?如果是這樣,它的定義是什麼樣的?如果不是,這些數據如何存儲,以及如何訪問? – 2010-08-13 18:39:38

回答

2

顯然,類時鐘進度 - 本身 - 是不夠的,你在做什麼。

您需要總結TimeClock以創建WorkIntervals,您可以使用它。這些是TimeClock行對,顯示工作範圍的(理論)開始和結束。

如果有人不能進入,你完全無法推斷出發生了什麼。 這不是「難」,這是不可能的。

此外,如果有人在午夜過後工作,則無法推斷出發生了什麼。 這不是「難」,這是不可能的。

但是,我們會假裝沒有一個工作過了午夜,沒有人不時鐘或縮小(哈哈哈)

def make_pairs(tc_query_set): 
    start = None 
    for row in tc_query_set: 
     if start is None: 
      start= row 
      continue 
     elif start.card == row.card and start.rec_date == row.rec_date: 
      yield start, row 
      start= None 
     else: 
      # May as well raise an exception -- the data cannot the processed 
      yield start, None 
      start= row 

使用此如下。

data = TimeClock.objects.order_by('card','rec_date','rec_time').all() 
for start, end in make_pairs(data): 
    WorkIntervals.objects.create(start.card, start.rec_date, start.rec_time, end.rec_time, ...) 

現在你可以使用間隔。如果有可能創建它們。

+0

哇......謝謝S.洛特......我嘗試了你的想法,它的工作就像一個魅力。 – Stephen 2010-08-14 14:42:26

1

嗯,有一羣在這裏不同的問題。我假設你已經有了過濾的數據,這樣你的日誌看起來就像某一天某個特定卡片上的所有事件。假設這些數據存儲爲log中的字符串列表。然後:

import datetime 
def dates(log): 
    ''' Yields consecutive datetimes in the log. ''' 
    for event in log: 
     yield datetime.datetime.strptime(event[ 12 : 28 ], "%Y-%m-%d %H:%M") 

def time_clocked_in(log): 
    assert not len(log) % 2 
    total_time = datetime.timedelta(0) 
    event_dates = dates(log) 
    try: 
     while 1: 
      total_time -= next(event_dates) - next(event_dates) 
    except StopIteration: 
     pass 
    return total_time 

log = [ 
    "2977 00040 2010-07-30 09:58 2010-07-31 13:37:31", 
    "2978 00040 2010-07-30 15:33 2010-07-31 13:37:31", 
    "2979 00040 2010-07-30 16:13 2010-07-31 13:37:31", 
    "2980 00040 2010-07-30 19:41 2010-07-31 13:37:31" 
] 

print(time_clocked_in(log)) 
>>> 9:03:00 
+0

我喜歡這個主意....雖然S.洛特提供了一個更直接的方法,但無論如何感謝 – Stephen 2010-08-14 14:44:59

相關問題