2

I have a nested list containing times and some corresponding information, and am trying to extract one line from the start of a block of times that follow on from each other by a second (e.g. 10:04:23,10:04:24,10:04:25..). There should be a lot of these little blocks. I'm not sure if what I have is on the right lines, and if it is, it raises a TypeError and I'm not sure how to get around it.

This is data relating to visits of animals to an area, and recordings are taken every second. My aim is to have only one recording per visit, hence the first line from a block of following-on times.

previous_and_next is stolen from 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 is raising TypeError: Can't convert 'datetime.timedelta' object to str implicitly, which I understand, but don't understand how to avoid. I'm not even certain this code does what I want it to do.

Thank you for your help!

Community
  • 1
  • 1
Snaaa
  • 256
  • 1
  • 3
  • 14
  • d[1] is a string ... I think you want `aftersecond = item[-1]+datetime.timedelta(seconds=1) ` ... actually d[-1] is going to be a string too... – Joran Beasley Jul 30 '12 at 15:28

2 Answers2

1

I am suggesting this solution which seems simpler but may be too simple:

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)

With this dummy data, assuming that there are two animal visits with three observations each, the result will be:

[['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)]]
dsh
  • 12,037
  • 3
  • 33
  • 51
daedalus
  • 10,873
  • 5
  • 50
  • 71
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)    

might work ...

Joran Beasley
  • 110,522
  • 12
  • 160
  • 179
  • I think that would append the wrong thing- data doesn't relate to dateTimes. It's certainly a start though, I'll test it out :) – Snaaa Jul 30 '12 at 15:37
  • with enumerate it should... im not sure what the previous_next_ function thing is though... – Joran Beasley Jul 30 '12 at 15:57