使用timedelta比较时间时避免TypeError

时间:2012-07-30 15:18:16

标签: python datetime timedelta

我有一个包含时间和一些相应信息的嵌套列表,并且我试图从一段时间之后的一段时间开始提取一行(例如10:04:23,10:04) :24,10:04:25。)。应该有很多这些小块。我不确定我的内容是否在正确的行上,如果是,则会引发TypeError,我不知道如何绕过它。

这是与动物到一个区域的访问有关的数据,每秒记录一次。我的目标是每次访问只有一次录音,因此是后续时段的第一行。

previous_and_next从here

被盗
    data=[['07/11/2012', '09:53:36', 'U', '#0F', '0006E7895B', 'T', 'U\n', '09:53:36'],
 ['05/13/2012', '09:54:27', 'U', '#0F', '0006E3DADA', 'T', 'U\n', '5031', '09:54:27'] etc]



       #define a function to get previous and following values
from itertools import tee, islice, chain
    def previous_and_next(some_iterable):
        prevs, items, nexts = tee(some_iterable, 3)
        prevs = chain([None], prevs)
        nexts = chain(islice(nexts, 1, None), [None])
        return zip(prevs, items, nexts)


    #convert times to datetime objects
    for d in data:
        try:
            f=datetime.datetime.strptime(d[1],'%H:%M:%S')
            g=f.strftime('%H:%M:%S')
            d.append(g)
        except:
            pass

    new_list=[]
    for prev,item,next in previous_and_next(data):
        aftersecond=item[1]+datetime.timedelta(seconds=1)
        if next[1]==aftersecond: #if next time is this time plus a second
            this=True
        else:
            this==False
        while this==True:
            continue
        else:
            new_list.append(data)                  

aftersecond正在提升TypeError: Can't convert 'datetime.timedelta' object to str implicitly,据我所知,但不明白如何避免。我甚至不确定这段代码是否符合我的要求。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我建议这个解决方案似乎更简单但可能太简单了:

import datetime

from pprint import pprint

data=[['07/11/2012', '09:53:36', 'U', '#0F', '0006E7895B', 'T', 'U\n', '09:53:36'],
      ['07/11/2012', '09:53:37', 'U', '#0F', '0006E7895B', 'T', 'U\n', '09:53:37'],
      ['07/11/2012', '09:53:38', 'U', '#0F', '0006E7895B', 'T', 'U\n', '09:53:38'],
      ['05/13/2012', '09:54:27', 'U', '#0F', '0006E3DADA', 'T', 'U\n', '5031', '09:54:27'],
      ['05/13/2012', '09:54:28', 'U', '#0F', '0006E3DADA', 'T', 'U\n', '5031', '09:54:28'],
      ['05/13/2012', '09:54:29', 'U', '#0F', '0006E3DADA', 'T', 'U\n', '5031', '09:54:29']]

#convert times to datetime objects
for d in data:
    dt = ' '.join( d[0:2] )
    dt = datetime.datetime.strptime(dt,'%m/%d/%Y %H:%M:%S')
    d.append( dt )

newdata = [ data[0] ]
latest_time = newdata[-1][-1]
for d in data[1:]:
    delta = d[-1] - latest_time
    latest_time = d[-1]
    if delta != datetime.timedelta(0, 1):
        newdata.append( d )

pprint(newdata)

使用这些虚拟数据,假设有两次动物访问,每次有三次观察,结果将是:

[['07/11/2012',
  '09:53:36',
  'U',
  '#0F',
  '0006E7895B',
  'T',
  'U\n',
  '09:53:36',
  datetime.datetime(2012, 7, 11, 9, 53, 36)],
 ['05/13/2012',
  '09:54:27',
  'U',
  '#0F',
  '0006E3DADA',
  'T',
  'U\n',
  '5031',
  '09:54:27',
  datetime.datetime(2012, 5, 13, 9, 54, 27)]]

答案 1 :(得分:0)

dateTimes = []
for d in data:
    try:
        f=datetime.datetime.strptime(d[1],'%H:%M:%S')
        g=f.strftime('%H:%M:%S')
        d.append(g)
        dateTimes.append(f) #append datetime object
        #you could also append f to the end of d ... 
    except:
        pass

new_list=[]
for i,prev,item,next in enumerate(previous_and_next(data)):
    aftersecond=dateTimes[i]+datetime.timedelta(seconds=1)
    if next[1]==aftersecond: #if next time is this time plus a second
        this=True
    else:
        this==False
    while this==True:
        continue
    else:
        new_list.append(data)    

可能有用......