1

重複したタイムスタンプを含むファイルがあります。タイムスタンプごとに最大 2 つです。実際には重複していません。ミリ秒のタイムスタンプを追加する必要があるのは 2 番目のタイムスタンプだけです。たとえば、これらをファイルに入れています。

....
2011/1/4    9:14:00
2011/1/4    9:15:00
2011/1/4    9:15:01
2011/1/4    9:15:01
2011/1/4    9:15:02
2011/1/4    9:15:02
2011/1/4    9:15:03
2011/1/4    9:15:03
2011/1/4    9:15:04
....

それらをに変更したい

2011/1/4    9:14:00
2011/1/4    9:15:00
2011/1/4    9:15:01
2011/1/4    9:15:01.500
2011/1/4    9:15:02
2011/1/4    9:15:02.500
2011/1/4    9:15:03
2011/1/4    9:15:03.500
2011/1/4    9:15:04
....

そのようなタスクを実行する最も効率的な方法は何ですか?

4

3 に答える 3

1

設定

In [69]: df = DataFrame(dict(time = x))

In [70]: df
Out[70]: 
                 time
0 2013-01-01 09:01:00
1 2013-01-01 09:01:00
2 2013-01-01 09:01:01
3 2013-01-01 09:01:01
4 2013-01-01 09:01:02
5 2013-01-01 09:01:02
6 2013-01-01 09:01:03
7 2013-01-01 09:01:03
8 2013-01-01 09:01:04
9 2013-01-01 09:01:04

前の行との時間差が 0 秒の場所を見つけます

In [71]: mask = (df.time-df.time.shift()) == np.timedelta64(0,'s')

In [72]: mask
Out[72]: 
0    False
1     True
2    False
3     True
4    False
5     True
6    False
7     True
8    False
9     True
Name: time, dtype: bool

5 ミリ秒のオフセットを使用するようにこれらの場所を設定します (質問では 500 を使用しましたが、何でもかまいません)。これには numpy >= 1.7 が必要です。(この構文が 0.13 で変更され、より直接的な構文が可能になるわけではありません。df.loc[mask,'time'] += pd.offsets.Milli(5)

In [73]: df.loc[mask,'time'] = df.time[mask].apply(lambda x: x+pd.offsets.Milli(5))

In [74]: df
Out[74]: 
                        time
0        2013-01-01 09:01:00
1 2013-01-01 09:01:00.005000
2        2013-01-01 09:01:01
3 2013-01-01 09:01:01.005000
4        2013-01-01 09:01:02
5 2013-01-01 09:01:02.005000
6        2013-01-01 09:01:03
7 2013-01-01 09:01:03.005000
8        2013-01-01 09:01:04
9 2013-01-01 09:01:04.005000
于 2013-08-10T12:58:34.053 に答える
1

したがって、このアルゴリズムは非常にうまく機能するはずです...私はnumpyのdatetimeデータ型で非常に苦労しています。

In [154]: df
Out[154]: 
                  0
0  2011/1/4 9:14:00
1  2011/1/4 9:15:00
2  2011/1/4 9:15:01
3  2011/1/4 9:15:01
4  2011/1/4 9:15:02
5  2011/1/4 9:15:02
6  2011/1/4 9:15:03
7  2011/1/4 9:15:03
8  2011/1/4 9:15:04


In [155]: ((dt.diff() == 0) * .005)
Out[155]: 
0    0.000
1    0.000
2    0.000
3    0.005
4    0.000
5    0.005
6    0.000
7    0.005
8    0.000
Name: 0, dtype: float64

そして、アイデアは、これら2つを一緒に追加することです。もちろん、一方はdatetime64で、もう一方はfloat64です。何らかの理由で、np.timedelta64配列で動作しませんか? とにかく、うまくいくdtypeの問題を整理できれば。

于 2013-08-10T12:28:49.107 に答える