Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用时间和日期对象分析数据_Python_Django - Fatal编程技术网

Python 使用时间和日期对象分析数据

Python 使用时间和日期对象分析数据,python,django,Python,Django,我有一个非常独特的问题要解决: 基于此样本数据(实际数据是非常多的记录,每天每张卡至少有4条记录): 这些记录来自时钟系统 我想做的是获取一组特定的条目,通过卡片和记录日期进行过滤,然后确定该人员在一天中工作了多长时间,每个工作时间的长度,他/她休息了多少次,并在一周结束时获得总工作小时数 从上面的列表中,2977是签入,然后2978是签出,依此类推 我不知道该怎么做,所以我想这里会有人有主意的 在从其他地方导入其他数据后,我使用一个简单的类来存储此数据: class TimeClock(mod

我有一个非常独特的问题要解决:

基于此样本数据(实际数据是非常多的记录,每天每张卡至少有4条记录):

这些记录来自时钟系统

我想做的是获取一组特定的条目,通过
卡片
记录日期
进行过滤,然后确定该人员在一天中工作了多长时间,每个工作时间的长度,他/她休息了多少次,并在一周结束时获得总工作小时数

从上面的列表中,
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)

嗯,这里有很多不同的问题。我假设您已经得到了过滤数据,因此您的日志看起来像是某一天某张独特卡片上的所有事件。假设此数据作为字符串列表存储在
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
很明显,课堂时钟本身并不适合你所做的事情

您需要汇总时钟以创建工作间隔,您可以使用它。这些是成对的时钟行,显示(理论)工作范围的开始和结束

如果有人没有打卡,你就完全无法解释到底发生了什么。 这不难,这是不可能的

此外,如果有人工作超过午夜,你无法解释发生了什么。 这不难,这是不可能的

但是,我们会假装没有人工作超过午夜,没有人不打卡上班或下班(哈哈哈)

你可以这样使用它

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, ... )

现在您可以使用间隔。如果有可能创建它们

你怎么知道某件事是签出还是签入?你是否假设结账总是在登记之后?这也是一个棘手的部分…我想有人可能会错过我们的结账…但理想情况下,是的,结账总是在登记之后。我已经建立了一个视图,允许添加一个条目,如果所有条目都是奇怪的,您可以提到Django,但不要真正说明数据的结构。这些记录在模型中吗?如果是,它的定义是什么?如果没有,这些数据是如何存储的,又是如何访问的?@Dominic:很抱歉丢失了模型类。我已经添加了它,虽然它很基本。哇…谢谢s.Lott…我尝试了你的想法,效果很好。我喜欢这个想法…虽然s.Lott提供了一个更直接的方法,但还是谢谢你
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, ... )