7

ミリ秒単位のPOSIXタイムスタンプを表す時間列を含むcsvファイルがあります。パンダで読むと、正しくInt64と表示されますが、DatetimeIndexに変換したいと思います。今のところ、最初にそれをdatetimeオブジェクトに変換してから、それをDatetimeIndexにキャストします。

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

これを行う慣用的な方法はありますか?そしてもっと重要なのは、これがパンダに一意でないタイムマップを保存するための推奨される方法ですか?

4

2 に答える 2

7

コンバーターは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
于 2012-09-03T19:13:02.733 に答える
5

内部的には、タイムスタンプはナノ秒を表すintに格納されます。彼らはnumpydatetime/timedeltaを使用します。タイムスタンプの問題は、タイムスタンプの精度がmsであるということです。これは、1000で除算しているため、すでにわかっています。この場合、astype('M8 [ms]')の方が簡単です。基本的に、これらのintをms精度の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]にあると想定します。datetime64dtypeの配列は正しく解釈されます。asi8DatetimeIndexのM8[ns]表現を表示するには、その属性にアクセスします。

[編集]これはread_csvを直接使用するのに役立たないことを理解しています。タイムスタンプ配列間ですばやく変換する方法を捨てると思っただけです。

于 2012-09-04T19:37:20.413 に答える