1

時間とそれに対応する情報を含むネストされたリストがあり、互いに 1 秒ずつ続く時間のブロックの先頭から 1 行を抽出しようとしています (例: 10:04:23,10:04:24, 10:04:25..)。これらの小さなブロックがたくさんあるはずです。私が持っているものが正しい行にあるかどうかはわかりません。正しい場合は TypeError が発生し、それを回避する方法がわかりません。

これは、ある地域への動物の訪問に関するデータで、1 秒ごとに記録されます。私の目的は、訪問ごとに 1 つの記録のみを作成することです。したがって、次の時間のブロックの最初の行です。

previous_and_next はここから盗まれます

    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ています。これは理解できますが、回避する方法がわかりません。このコードが私がやりたいことを実行するかどうかさえ確信が持てません。

ご協力ありがとうございました!

4

2 に答える 2

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)

このダミー データを使用して、それぞれ 3 つの観測値を持つ 2 つの動物の訪問があると仮定すると、結果は次のようになります。

[['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)]]
于 2012-07-30T16:13:27.863 に答える
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)    

うまくいくかもしれません...

于 2012-07-30T15:31:40.973 に答える