0

このリストにはタイムスタンプがあり、ユーザーの入力 (時間 <= 24 または真夜中からの日数、またはどちらでもない) に応じて、特定のタイムスパン (すべてのタイムスパンには別のリストに対応する情報があります) のすべての要素を検索できるようにしたいと考えています。 .

例 (これは単なるリストの例です。ソリューションは非常に大きなリストで機能するはずです)

list =  ['2002-03-31 19:30:41', '2002-03-31 19:30:41', '2002-03-31 19:43:49', '2002-03-31     19:43:50', '2002-03-31 19:50:05', '2002-03-31 19:50:06', '2002-03-31 19:50:06', '2002-03-31 19:50:44', '2002-03-31 19:50:45', '2002-03-31 19:50:45', '2002-03-31 19:51:50', '2002-03-31 19:51:50', '2002-03-31 19:51:50', '2002-03-31 19:52:25', '2002-03-31 19:52:25', '2002-03-31 19:52:25', '2002-03-31 19:53:05', '2002-03-31 19:53:06', '2002-03-31 19:53:06', '2002-03-31 19:53:06', '2002-03-31 19:53:17', '2002-03-31 19:54:14', '2002-03-31 19:54:14']
activity= [a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w]

最後の要素list[-1]を参照点として使用します。ユーザーが過去 3 時間のアクティビティを確認したい場合は2002-03-31 16:54:14 to 2002-03-31 19:54:14、タイムスタンプの位置からの手段を使用して、他のリストからアクティビティを取得します。最初に、すべてのタイムスタンプを使用可能なものに変換して、各要素を比較しやすくすることを考えましたが、もっと簡単な解決策が必要です。

このモジュールは使用可能に見えますが、どのように使用できるかわかりません。

よろしくお願いします

4

4 に答える 4

1

ワークフローとして:

  • モジュールを使用して、メソッドで文字列をオブジェクトdatetimeに変換します。オブジェクトのリストを取得します。datetimestrptimedatetime
  • timedeltasこのリストの各エントリを最後のエントリから差し引いて計算します。
  • secondsa の属性を使用して、timedelta1 つのポイントと参照の間の秒数を調べることができます。これを3*3600(3h) と比較して、適切な期間に含まれるアイテムを見つけます。
于 2012-09-25T17:21:19.983 に答える
1

タイムスタンプが最も簡単な順序で並べ替えられているという点で、あなたは信じられないほど幸運であり、「時間値への変換」全体をパントして、文字列比較を行うだけです。

times =  ['2002-03-31 19:30:41', '2002-03-31 19:30:41', '2002-03-31 19:43:49', '2002-03-31     19:43:50', '2002-03-31 19:50:05', '2002-03-31 19:50:06', '2002-03-31 19:50:06', '2002-03-31 19:50:44', '2002-03-31 19:50:45', '2002-03-31 19:50:45', '2002-03-31 19:51:50', '2002-03-31 19:51:50', '2002-03-31 19:51:50', '2002-03-31 19:52:25', '2002-03-31 19:52:25', '2002-03-31 19:52:25', '2002-03-31 19:53:05', '2002-03-31 19:53:06', '2002-03-31 19:53:06', '2002-03-31 19:53:06', '2002-03-31 19:53:17', '2002-03-31 19:54:14', '2002-03-31 19:54:14']
activity= ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w']

start = '2002-03-31 16:54:14'
end = '2002-03-31 19:54:14'

for time, activity in zip(times, activity):
    if time >= start and time <= end:
        print time, activity
于 2012-09-25T18:00:06.520 に答える
0

このようなものが動作するはずです

ls =  ['2002-03-31 19:30:41', '2002-03-31 19:30:41', '2002-03-31 19:43:49', '2002-03-31     19:43:50', '2002-03-31 19:50:05', '2002-03-31 19:50:06', '2002-03-31 19:50:06', '2002-03-31 19:50:44', '2002-03-31 19:50:45', '2002-03-31 19:50:45', '2002-03-31 19:51:50', '2002-03-31 19:51:50', '2002-03-31 19:51:50', '2002-03-31 19:52:25', '2002-03-31 19:52:25', '2002-03-31 19:52:25', '2002-03-31 19:53:05', '2002-03-31 19:53:06', '2002-03-31 19:53:06', '2002-03-31 19:53:06', '2002-03-31 19:53:17', '2002-03-31 19:54:14', '2002-03-31 19:54:14']

# target is one of the items in the list
target = datetime.strptime('2002-03-31 19:53:17', '%Y-%m-%d %H:%M:%S')
for l in ls:
    print datetime.strptime(l, '%Y-%m-%d %H:%M:%S') - target

版画

-1 day, 23:37:24
-1 day, 23:37:24
-1 day, 23:50:32
-1 day, 23:50:33
-1 day, 23:56:48
-1 day, 23:56:49
-1 day, 23:56:49
-1 day, 23:57:27
-1 day, 23:57:28
-1 day, 23:57:28
-1 day, 23:58:33
-1 day, 23:58:33
-1 day, 23:58:33
-1 day, 23:59:08
-1 day, 23:59:08
-1 day, 23:59:08
-1 day, 23:59:48
-1 day, 23:59:49
-1 day, 23:59:49
-1 day, 23:59:49
0:00:00
0:00:57
0:00:57

はオブジェクト ( docsdatetime.strptime(l, '%Y-%m-%d %H:%M:%S') - target )を返します。オブジェクトと属性にアクセスして、それらを目的の期間と比較できます。たとえば、ある基準点から 1 時間以内に発生したすべてのイベントのすべてのインデックスを取得するには、次のようにします。timedeltatimedeltadayssecondsmicroseconds

less_than_an_hour = []
for i,l in enumerate(ls):
    if (datetime.strptime(l, '%Y-%m-%d %H:%M:%S') - target).seconds < 3600:
        less_than_an_hour.append(i)
于 2012-09-25T17:23:32.883 に答える
0

私は:

  • タイムスタンプのリストをdatetimeオブジェクトに変換します。

    times = [datetime.datetime.strptime(t, '%Y-%m-%d %H:%M:%S') for t in times]
    
  • bisectモジュールを使用して、ユーザーが要求した開始時刻を見つけます。ユーザー入力をオブジェクトに変換する場合、線形検索を使用bisectするよりもはるかに高速な方法です。datetime

    start = datetime.datetime(2002, 3, 31, 19, 53, 17)
    startindex = bisect.bisect_left(times, start)
    
  • 関数を使用itertoolsして、2 つのリストを 1 つにマージし、範囲に一致するエントリを表示します。

    end = datetime.datetime(2002, 4, 1, 07, 53, 17)
    
    merged = itertools.izip(times, activity)
    fromstart = itertools.islice(merged, startindex)
    untilend = itertools.takewhile(lambda e: e[0] <= end, fromstart)
    

untilenditerable は、コピーされたリストに余分なメモリを使用することなく、タプルとタプルの間でエントリを生成するようになりましstartた。これにより、大量のデータを効率的に処理できます。end(time, activity)

デモ:

>>> import itertools
>>> import datetime
>>> import bisect
>>> times =  ['2002-03-31 19:30:41', '2002-03-31 19:30:41', '2002-03-31 19:43:49', '2002-03-31     19:43:50', '2002-03-31 19:50:05', '2002-03-31 19:50:06', '2002-03-31 19:50:06', '2002-03-31 19:50:44', '2002-03-31 19:50:45', '2002-03-31 19:50:45', '2002-03-31 19:51:50', '2002-03-31 19:51:50', '2002-03-31 19:51:50', '2002-03-31 19:52:25', '2002-03-31 19:52:25', '2002-03-31 19:52:25', '2002-03-31 19:53:05', '2002-03-31 19:53:06', '2002-03-31 19:53:06', '2002-03-31 19:53:06', '2002-03-31 19:53:17', '2002-03-31 19:54:14', '2002-03-31 19:54:14']
>>> activity= ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w']
>>> times = [datetime.datetime.strptime(t, '%Y-%m-%d %H:%M:%S') for t in times]
>>> start = datetime.datetime(2002, 3, 31, 19, 53, 17)
>>> end = datetime.datetime(2002, 4, 1, 07, 53, 17)
>>> startindex = bisect.bisect_left(times, start)
>>> merged = itertools.izip(times, activity)
>>> fromstart = itertools.islice(merged, startindex)
>>> untilend = itertools.takewhile(lambda e: e[0] <= end, fromstart)
>>> for time, activity in untilend:
...     print time, activity
... 
2002-03-31 19:30:41 a
2002-03-31 19:30:41 b
2002-03-31 19:43:49 c
2002-03-31 19:43:50 d
2002-03-31 19:50:05 e
2002-03-31 19:50:06 f
2002-03-31 19:50:06 g
2002-03-31 19:50:44 h
2002-03-31 19:50:45 i
2002-03-31 19:50:45 j
2002-03-31 19:51:50 k
2002-03-31 19:51:50 l
2002-03-31 19:51:50 m
2002-03-31 19:52:25 n
2002-03-31 19:52:25 o
2002-03-31 19:52:25 p
2002-03-31 19:53:05 q
2002-03-31 19:53:06 r
2002-03-31 19:53:06 s
2002-03-31 19:53:06 t
于 2012-09-25T19:54:56.433 に答える