2010-08-13 3 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으로 필터링 된 특정 항목 그룹을 취한 다음 하루 동안 작업 한 기간과 각 작업 범위의 길이, 촬영 한 휴식 횟수를 결정하는 것입니다. , 그리고 주말에는 일한 총 시간 수를 구하십시오.

위의 목록에서 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

체크 아웃과 체크인 중 어떤 것이 있는지 어떻게 알 수 있습니까? 체크 아웃이 항상 체크인을 따르는 것으로 가정합니까? –

+0

그건 까다로운 부분 중 하나이기도합니다 ... 누군가 체크 - 인 체크 아웃을 놓칠지도 모른다고 생각합니다 ....하지만 이상적으로 체크 - 아웃은 항상 체크 - 인을 따릅니다. 전체 항목이 홀수 인 경우 항목을 추가 할 수 있도록보기를 배치했습니다. – Stephen

+0

Django에 대해 언급했지만 데이터가 어떻게 구성되는지는 실제로 말하지 않습니다. 이 레코드가 모델입니까? 그렇다면 정의는 어떻게 생겼는가? 그렇지 않은 경우이 데이터는 어떻게 저장되며 어떻게 액세스됩니까? –

답변

2

분명히 TimeClock 클래스는 자신이하는 일에 부적합합니다.

작업 할 수있는 WorkIntervals를 만들려면 TimeClock을 요약해야합니다. 이들은 작업 범위의 (이론적 인) 시작과 끝을 보여주는 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

와우 ... 고마워요. 로트 ... 당신의 아이디어를 시험해 보니 매력적이었습니다. – Stephen

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

나는이 아이디어가 .... 좋아.Lott는 좀 더 직접적인 접근 방식을 제공했지만 어쨌든 고마워요 – Stephen

관련 문제