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