2010-08-13 51 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

相关问题