2012-09-03 6 views
7

私はミリ秒単位でPOSIXタイムスタンプを表す時間列を持つcsvファイルを持っています。私がパンダで読むと、正しくInt64として読み込まれますが、DatetimeIndexに変換したいと思います。今はまずそれをdatetimeオブジェクトに変換し、DatetimeIndexにキャストします。パンダのPOSIXタイムスタンプを解析する慣習的な方法は?

In [20]: df.time.head() 

Out[20]: 
0 1283346000062 
1 1283346000062 
2 1283346000062 
3 1283346000062 
4 1283346000300 
Name: time 

In [21]: map(datetime.fromtimestamp, df.time.head()/1000.) 
Out[21]: 
[datetime.datetime(2010, 9, 1, 9, 0, 0, 62000), 
datetime.datetime(2010, 9, 1, 9, 0, 0, 62000), 
datetime.datetime(2010, 9, 1, 9, 0, 0, 62000), 
datetime.datetime(2010, 9, 1, 9, 0, 0, 62000), 
datetime.datetime(2010, 9, 1, 9, 0, 0, 300000)] 

In [22]: pandas.DatetimeIndex(map(datetime.fromtimestamp, df.time.head()/1000.)) 
Out[22]: 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2010-09-01 09:00:00.062000, ..., 2010-09-01 09:00:00.300000] 
Length: 5, Freq: None, Timezone: None 

これを行うための慣習的な方法はありますか?さらに重要なのは、パンダに非ユニ​​ークなタイムマップを保存するために推奨される方法ですか?

答えて

6

コンバータはread_csvと組み合わせて使用​​できます。

In [423]: d = """\ 
timestamp data 
1283346000062 a 
1283346000062 b 
1283346000062 c 
1283346000062 d 
1283346000300 e 
""" 

In [424]: fromtimestamp = lambda x:datetime.fromtimestamp(int(x)/1000.) 

In [425]: df = pandas.read_csv(StringIO(d), sep='\s+', converters={'timestamp': fromtimestamp}).set_index('timestamp') 

In [426]: df.index 
Out[426]: 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2010-09-01 15:00:00.062000, ..., 2010-09-01 15:00:00.300000] 
Length: 5, Freq: None, Timezone: None 

In [427]: df 
Out[427]: 
          data 
timestamp 
2010-09-01 15:00:00.062000 a 
2010-09-01 15:00:00.062000 b 
2010-09-01 15:00:00.062000 c 
2010-09-01 15:00:00.062000 d 
2010-09-01 15:00:00.300000 e 
+1

ありがとうございます!これは私がやっていたことよりも簡単です。パンダは不規則に間隔を置いていてタイムシェアされていないタイムシーズンのための良いツールだと思いますか? – signalseeker

+1

パンダは、不規則に間隔を置いて、ユニークでタイムスタンプのないタイムシーズンを処理することができます。 timeseriesはパンダのための大きなものです –

5

内部的には、タイムスタンプはナノ秒を表すintで格納されます。彼らはnumpyを使用しますdatetime/timedelta。あなたのタイムスタンプの問題は、それらがms精度であることです。あなたが1000で割っているので既に知っています。この場合、astype( 'M8 [ms]')が簡単です。基本的には、これらのintをミリ秒精度のdatetime-intとみなすことです。

In [21]: int_arr 
Out[21]: 
array([1283346000062, 1283346000062, 1283346000062, 1283346000062, 
     1283346000300]) 

In [22]: int_arr.astype('M8[ms]') 
Out[22]: 
array(['2010-09-01T09:00:00.062-0400', '2010-09-01T09:00:00.062-0400', 
     '2010-09-01T09:00:00.062-0400', '2010-09-01T09:00:00.062-0400', 
     '2010-09-01T09:00:00.300-0400'], dtype='datetime64[ms]') 

パンダは、通常のint配列はM8 [ns]にあるものとみなします。 datetime64 dtypeの配列は正しく解釈されます。 DatetimeIndexのM8 [ns]表現は、asi8属性にアクセスすることで表示できます。

[編集]私はこれがread_csvであなたを直接助けることはないことを認識しています。ちょうど私がタイムスタンプ配列の間で素早く変換する方法を捨てると思った。

+0

ありがとう、これは知っておいて良いです。 – signalseeker

+1

この方法はコンバータを使用するよりも高速です。パンダは、フードの下でms - > nsを透過的にキャストします –

+0

ありがとうございます。記録的には、このアプローチはコンバータを使用するよりも約40%高速です。 – signalseeker

関連する問題