Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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_Python 3.x - Fatal编程技术网

Python 根据日期列表计算时间

Python 根据日期列表计算时间,python,python-3.x,Python,Python 3.x,我正在寻找一个最简单的解决方案来计算时间。我有一个样本列表如下。我需要计算每天的结束时间-开始时间。例如2018-07-117:00-08:00=09:00。我尝试了很多循环,并使用itertools.compositions进行迭代,但总是失败 [['2018-07-01', '8:00', 'IN'], ['2018-07-01', '12:00', 'OUT'], ['2018-07-01', '12:30', 'IN'], ['2018-07-01', '17:00', 'OUT']

我正在寻找一个最简单的解决方案来计算时间。我有一个样本列表如下。我需要计算每天的结束时间-开始时间。例如2018-07-117:00-08:00=09:00。我尝试了很多循环,并使用itertools.compositions进行迭代,但总是失败

[['2018-07-01', '8:00', 'IN'], 
['2018-07-01', '12:00', 'OUT'], 
['2018-07-01', '12:30', 'IN'],
['2018-07-01', '17:00', 'OUT'], 
['2018-07-02', '8:00', 'IN'], 
['2018-07-02', '12:00', 'OUT'], 
['2018-07-02', '12:30', 'IN'], 
['2018-07-02', '17:00', 'OUT'], 
['2018-07-03', '8:00', 'IN'], 
['2018-07-03', '12:00', 'OUT'], 
['2018-07-03', '12:30', 'IN'],
['2018-07-03', '17:00', 'OUT'],
['2018-07-04', '8:00', 'IN'], 
['2018-07-04', '17:00', 'OUT']]
我的尝试:

for idx, elemenet in enumerate(test):
    try:
        if elemenet[0] == test[idx + 1][0]:
            print(elemenet)
    except:
        pass

index = 0
for a, b in itertools.combinations(test, 2):
    if a[0] and b[0] and a[2] == 'IN' and b[2] == 'OUT':
        print(a , b)
        index += 1
print(index)

似乎开始时间总是最早出现,结束时间总是最晚出现。这就是您可以做的(请注意语法不太正确,因为我已经有一段时间没有用python编程了,但您应该了解总体思路)

i=0
而我

我还没有想清楚这一点,但我认为它应该有效,否则有人会纠正我:)

似乎开始时间总是最早出现,结束时间总是最晚出现。这就是您可以做的(请注意语法不太正确,因为我已经有一段时间没有用python编程了,但您应该了解总体思路)

i=0
而我

我还没有想清楚这一点,但我认为它应该有效,否则有人会纠正我:)

我想你想要的是每天最晚时间和最早时间之间的差异?如果是这样,我认为pandas
中的这个解决方案应该有效:你只需按天分组,然后取第一个小时和最后一个小时,然后减去它们(注意,在你的数据中,开始和结束时间总是8和17;最好用实际有可变答案的数据来测试)


我假设你想要的是每天最晚时间和最早时间之间的差异?如果是这样,我认为pandas
中的这个解决方案应该有效:你只需按天分组,然后取第一个小时和最后一个小时,然后减去它们(注意,在你的数据中,开始和结束时间总是8和17;最好用实际有可变答案的数据来测试)


下面是一个使用python3的
itertools.groupby
的解决方案

>>> lst = [['2018-07-01', '8:00', 'IN'], ['2018-07-01', '12:00', 'OUT'], ['2018-07-01', '12:30', 'IN'], ['2018-07-01', '17:00', 'OUT'], ['2018-07-02', '8:00', 'IN'], ['2018-07-02', '12:00', 'OUT'], ['2018-07-02', '12:30', 'IN'], ['2018-07-02', '17:00', 'OUT'], ['2018-07-03', '8:00', 'IN'], ['2018-07-03', '12:00', 'OUT'], ['2018-07-03', '12:30', 'IN'], ['2018-07-03', '17:00', 'OUT'], ['2018-07-04', '8:00', 'IN'], ['2018-07-04', '17:00', 'OUT']]
>>> 
>>> from datetime import datetime
>>> from itertools import groupby
>>> to_time = lambda s: datetime.strptime(s, '%H:%M')
>>> diff_time = lambda s1, s2: str(to_time(s1)-to_time(s2))
>>> 
>>> res = {date:diff_time(last[1], first[1]) for date,(first,*_,last) in groupby(lst, lambda x: x[0])}
>>> pprint(res)
{'2018-07-01': '9:00:00',
 '2018-07-02': '9:00:00',
 '2018-07-03': '9:00:00',
 '2018-07-04': '9:00:00'}
对于python2,您需要用这两行替换
res=
line

>>> res = {date:list(times) for date,times in groupby(lst, lambda x: x[0])}
>>> res = {date:diff_time(times[-1][1], times[0][1]) for date,times in res.items()}

下面是一个使用python3的
itertools.groupby
的解决方案

>>> lst = [['2018-07-01', '8:00', 'IN'], ['2018-07-01', '12:00', 'OUT'], ['2018-07-01', '12:30', 'IN'], ['2018-07-01', '17:00', 'OUT'], ['2018-07-02', '8:00', 'IN'], ['2018-07-02', '12:00', 'OUT'], ['2018-07-02', '12:30', 'IN'], ['2018-07-02', '17:00', 'OUT'], ['2018-07-03', '8:00', 'IN'], ['2018-07-03', '12:00', 'OUT'], ['2018-07-03', '12:30', 'IN'], ['2018-07-03', '17:00', 'OUT'], ['2018-07-04', '8:00', 'IN'], ['2018-07-04', '17:00', 'OUT']]
>>> 
>>> from datetime import datetime
>>> from itertools import groupby
>>> to_time = lambda s: datetime.strptime(s, '%H:%M')
>>> diff_time = lambda s1, s2: str(to_time(s1)-to_time(s2))
>>> 
>>> res = {date:diff_time(last[1], first[1]) for date,(first,*_,last) in groupby(lst, lambda x: x[0])}
>>> pprint(res)
{'2018-07-01': '9:00:00',
 '2018-07-02': '9:00:00',
 '2018-07-03': '9:00:00',
 '2018-07-04': '9:00:00'}
对于python2,您需要用这两行替换
res=
line

>>> res = {date:list(times) for date,times in groupby(lst, lambda x: x[0])}
>>> res = {date:diff_time(times[-1][1], times[0][1]) for date,times in res.items()}

使用简单的python代码,这将像

from datetime import datetime
l=[['2018-07-01', '8:00', 'IN'], 
   ['2018-07-01', '12:00', 'OUT'], 
   ['2018-07-01', '12:30', 'IN'],
   ['2018-07-01', '17:00', 'OUT'], 
   ['2018-07-02', '8:00', 'IN'], 
   ['2018-07-02', '12:00', 'OUT'], 
   ['2018-07-02', '12:30', 'IN'], 
   ['2018-07-02', '17:00', 'OUT'], 
   ['2018-07-03', '8:00', 'IN'], 
   ['2018-07-03', '12:00', 'OUT'], 
   ['2018-07-03', '12:30', 'IN'],
   ['2018-07-03', '17:00', 'OUT'],
   ['2018-07-04', '8:00', 'IN'], 
   ['2018-07-04', '17:00', 'OUT']]


   def sortt(key1,key2):
     dt=key1.split('-')
     tt=key2.split(':')
     return datetime(int(dt[0]),int(dt[1]),int(dt[2]),int(tt[0]),int(tt[1]))




  sortedlist=sorted(l,key=lambda x: sortt(x[0],x[1]))

  currentDate=sortedlist[0][0]
  currentTime=sortedlist[0][1]
  for i in range(1,len(sortedlist)):
    if currentDate!=sortedlist[i][0] or i==len(sortedlist)-1:
      if i==len(sortedlist)-1:
          print(currentDate+' '+sortedlist[i-1][1]+'-'+currentTime)
          break
      else:
          print(currentDate+' '+currentTime+'-'+sortedlist[i-1][1])
      currentDate=sortedlist[i+1][0]
      currentTime=sortedlist[i+1][1]
输出:

2018-07-01 8:00-17:00

dates = [['2018-07-01', '8:00', 'IN'], 
['2018-07-01', '12:00', 'OUT'], 
['2018-07-01', '12:30', 'IN'],
['2018-07-01', '17:00', 'OUT'], 
['2018-07-02', '8:00', 'IN'], 
['2018-07-02', '12:00', 'OUT'], 
['2018-07-02', '12:30', 'IN'], 
['2018-07-02', '17:00', 'OUT'], 
['2018-07-03', '8:00', 'IN'], 
['2018-07-03', '12:00', 'OUT'], 
['2018-07-03', '12:30', 'IN'],
['2018-07-03', '17:00', 'OUT'],
['2018-07-04', '8:00', 'IN'], 
['2018-07-04', '17:00', 'OUT']]

totalTime = dict()

for item in dates:
  date    = item[0]
  hr, min = item[1].split(':')
  time    = float(hr) * 60 + float(min)
  inout   = item[2]

  if not date in totalTime:
    totalTime[date] = 0

  if(inout == 'IN'):
    totalTime[date] -= time
  else:
    totalTime[date] += time

for date, time in totalTime.iteritems():
  print(date, time/60)
2018-07-02 12:00-17:00

2018-07-03 12:00-17:00


2018-07-04 8:00-17:00

使用简单的python代码,这将像

from datetime import datetime
l=[['2018-07-01', '8:00', 'IN'], 
   ['2018-07-01', '12:00', 'OUT'], 
   ['2018-07-01', '12:30', 'IN'],
   ['2018-07-01', '17:00', 'OUT'], 
   ['2018-07-02', '8:00', 'IN'], 
   ['2018-07-02', '12:00', 'OUT'], 
   ['2018-07-02', '12:30', 'IN'], 
   ['2018-07-02', '17:00', 'OUT'], 
   ['2018-07-03', '8:00', 'IN'], 
   ['2018-07-03', '12:00', 'OUT'], 
   ['2018-07-03', '12:30', 'IN'],
   ['2018-07-03', '17:00', 'OUT'],
   ['2018-07-04', '8:00', 'IN'], 
   ['2018-07-04', '17:00', 'OUT']]


   def sortt(key1,key2):
     dt=key1.split('-')
     tt=key2.split(':')
     return datetime(int(dt[0]),int(dt[1]),int(dt[2]),int(tt[0]),int(tt[1]))




  sortedlist=sorted(l,key=lambda x: sortt(x[0],x[1]))

  currentDate=sortedlist[0][0]
  currentTime=sortedlist[0][1]
  for i in range(1,len(sortedlist)):
    if currentDate!=sortedlist[i][0] or i==len(sortedlist)-1:
      if i==len(sortedlist)-1:
          print(currentDate+' '+sortedlist[i-1][1]+'-'+currentTime)
          break
      else:
          print(currentDate+' '+currentTime+'-'+sortedlist[i-1][1])
      currentDate=sortedlist[i+1][0]
      currentTime=sortedlist[i+1][1]
dates = [['2018-07-01', '8:00', 'IN'], 
['2018-07-01', '12:00', 'OUT'], 
['2018-07-01', '12:30', 'IN'],
['2018-07-01', '17:00', 'OUT'], 
['2018-07-02', '8:00', 'IN'], 
['2018-07-02', '12:00', 'OUT'], 
['2018-07-02', '12:30', 'IN'], 
['2018-07-02', '17:00', 'OUT'], 
['2018-07-03', '8:00', 'IN'], 
['2018-07-03', '12:00', 'OUT'], 
['2018-07-03', '12:30', 'IN'],
['2018-07-03', '17:00', 'OUT'],
['2018-07-04', '8:00', 'IN'], 
['2018-07-04', '17:00', 'OUT']]

totalTime = dict()

for item in dates:
  date    = item[0]
  hr, min = item[1].split(':')
  time    = float(hr) * 60 + float(min)
  inout   = item[2]

  if not date in totalTime:
    totalTime[date] = 0

  if(inout == 'IN'):
    totalTime[date] -= time
  else:
    totalTime[date] += time

for date, time in totalTime.iteritems():
  print(date, time/60)
输出:

2018-07-01 8:00-17:00

dates = [['2018-07-01', '8:00', 'IN'], 
['2018-07-01', '12:00', 'OUT'], 
['2018-07-01', '12:30', 'IN'],
['2018-07-01', '17:00', 'OUT'], 
['2018-07-02', '8:00', 'IN'], 
['2018-07-02', '12:00', 'OUT'], 
['2018-07-02', '12:30', 'IN'], 
['2018-07-02', '17:00', 'OUT'], 
['2018-07-03', '8:00', 'IN'], 
['2018-07-03', '12:00', 'OUT'], 
['2018-07-03', '12:30', 'IN'],
['2018-07-03', '17:00', 'OUT'],
['2018-07-04', '8:00', 'IN'], 
['2018-07-04', '17:00', 'OUT']]

totalTime = dict()

for item in dates:
  date    = item[0]
  hr, min = item[1].split(':')
  time    = float(hr) * 60 + float(min)
  inout   = item[2]

  if not date in totalTime:
    totalTime[date] = 0

  if(inout == 'IN'):
    totalTime[date] -= time
  else:
    totalTime[date] += time

for date, time in totalTime.iteritems():
  print(date, time/60)
2018-07-02 12:00-17:00

2018-07-03 12:00-17:00

2018-07-04 8:00-17:00

dates = [['2018-07-01', '8:00', 'IN'], 
['2018-07-01', '12:00', 'OUT'], 
['2018-07-01', '12:30', 'IN'],
['2018-07-01', '17:00', 'OUT'], 
['2018-07-02', '8:00', 'IN'], 
['2018-07-02', '12:00', 'OUT'], 
['2018-07-02', '12:30', 'IN'], 
['2018-07-02', '17:00', 'OUT'], 
['2018-07-03', '8:00', 'IN'], 
['2018-07-03', '12:00', 'OUT'], 
['2018-07-03', '12:30', 'IN'],
['2018-07-03', '17:00', 'OUT'],
['2018-07-04', '8:00', 'IN'], 
['2018-07-04', '17:00', 'OUT']]

totalTime = dict()

for item in dates:
  date    = item[0]
  hr, min = item[1].split(':')
  time    = float(hr) * 60 + float(min)
  inout   = item[2]

  if not date in totalTime:
    totalTime[date] = 0

  if(inout == 'IN'):
    totalTime[date] -= time
  else:
    totalTime[date] += time

for date, time in totalTime.iteritems():
  print(date, time/60)
输出:

('2018-07-04', 9.0)
('2018-07-01', 8.5)
('2018-07-02', 8.5)
('2018-07-03', 8.5)
输出:

('2018-07-04', 9.0)
('2018-07-01', 8.5)
('2018-07-02', 8.5)
('2018-07-03', 8.5)

显示您的尝试。您是否可以将数据放入pandas数据框,如果可以,我可能会有一个解决方案?显示您的尝试。您是否可以将数据放入pandas数据框,如果可以,我可能会有一个解决方案?