2016-01-19 16 views
19

タイムスタンプがUNIXのタイムスタンプを表す文字列である巨大な量のCSVファイルを処理する必要があります。これらの列を効率的に変更する方法がまだ見つかりませんでした。Unixタイムスタンプ(ミリ秒単位)の行をdatetimeに変換する

これは私が思いついたことですが、これはもちろん列だけを複製するもので、何とか元のデータセットに戻す必要があります。私はそれがDataFrameを作成するときに行うことができると確信していますか?

import sys 
if sys.version_info[0] < 3: 
    from StringIO import StringIO 
else: 
    from io import StringIO 
import pandas as pd 

data = 'RUN,UNIXTIME,VALUE\n1,1447160702320,10\n2,1447160702364,20\n3,1447160722364,42' 

df = pd.read_csv(StringIO(data)) 

convert = lambda x: datetime.datetime.fromtimestamp(x/1e3) 
converted_df = df['UNIXTIME'].apply(convert) 

これはしかし、私はデータセット全体を取得するためにpd.apply()のようなものを使用したい列「UNIXTIME」を選択し、この

0 2015-11-10 14:05:02.320 
1 2015-11-10 14:05:02.364 
2 2015-11-10 14:05:22.364 
Name: UNIXTIME, dtype: datetime64[ns] 

0 1447160702320 
1 1447160702364 
2 1447160722364 
Name: UNIXTIME, dtype: int64 

からそれを変更します変換された列で返されるか、すでに書いたように、単にCSVからDataFrameを生成するときにdatetimesを作成するだけです。

答えて

20

あなたはto_datetimeを使用して引数unit='ms'を渡し後処理ステップとしてこれを行うことができます。

In [5]: 
df['UNIXTIME'] = pd.to_datetime(df['UNIXTIME'], unit='ms') 
df 

Out[5]: 
    RUN    UNIXTIME VALUE 
0 1 2015-11-10 13:05:02.320  10 
1 2 2015-11-10 13:05:02.364  20 
2 3 2015-11-10 13:05:22.364  42 
+0

ああ、私は完全にunit'パラメータは、おかげで、それは素晴らしいものだ 'ことを逃しました! parse_datesを介して '.read_csv'にそれを含めるようにプルリクエストを行います。 – tamasgal

+0

これは、タイムゾーンの問題のために間違った時間につながる可能性があります。 –

+0

@PengjuZhao OPの質問では、Teudimundoの答えがそれを解決するためには、 – EdChum

2

私は私が推測する解決策を考え出した:これはしかし最高のものであれば、私はまだわからない

convert = lambda x: datetime.datetime.fromtimestamp(float(x)/1e3) 

df = pd.read_csv(StringIO(data), parse_dates=['UNIXTIME'], date_parser=convert) 

4

私は@EdChumソリューションを使用しますが、私はタイムゾーンの管理を追加します。

df['UNIXTIME']=pd.DatetimeIndex(pd.to_datetime(pd['UNIXTIME'], unit='ms'))\ 
       .tz_localize('UTC')\ 
       .tz_convert('America/New_York') 

tz_localizeタイムスタンプを 'UTC'とみなすべきであることを示している場合、tz_convertは実際に日付/時刻を正しいタイムゾーン(この場合はAmerica/New_York)に移動します。

tz_メソッドはシリーズのインデックスに対してのみ機能するため、DatetimeIndexに変換されていることに注意してください。パンダ0.15 1ので.dtを使用することができます。

df['UNIXTIME']=pd.to_datetime(pd['UNIXTIME'], unit='ms')\ 
       .dt.tz_localize('UTC')\ 
       .dt.tz_convert('America/New_York') 
関連する問題