2

タイムスタンプ付きの 2 つの列を持つデータ フレームがあります。

In [12]: df = pd.DataFrame({"start_time": range(1380805471, 1380805481), "end_time" : range(1380805481, 1380805491)})

In [13]: df.ix[:,['start_time','end_time']]
Out[13]: 
   start_time    end_time
0  1380805471  1380805481
1  1380805472  1380805482
2  1380805473  1380805483
3  1380805474  1380805484
4  1380805475  1380805485
5  1380805476  1380805486
6  1380805477  1380805487
7  1380805478  1380805488
8  1380805479  1380805489
9  1380805480  1380805490

2 番目のステップは、start_time が end_time の前に表示されるようにするか、または列がアルファベット順に表示されるようにすることですdf

ここで、これらのタイムスタンプを人間が読める時間に変換して表示したいと考えています。現在、私はやっています::

In [15]: import datetime as dt

In [16]: df['start_time'] = [dt.datetime.fromtimestamp(t) for t in df.start_time]

In [17]: df['end_time'] = [dt.datetime.fromtimestamp(t) for t in df.end_time]

In [18]: df.ix[:,['start_time','end_time']]
Out[18]: 
           start_time            end_time
0 2013-10-03 18:34:31 2013-10-03 18:34:41
1 2013-10-03 18:34:32 2013-10-03 18:34:42
2 2013-10-03 18:34:33 2013-10-03 18:34:43
3 2013-10-03 18:34:34 2013-10-03 18:34:44
4 2013-10-03 18:34:35 2013-10-03 18:34:45
5 2013-10-03 18:34:36 2013-10-03 18:34:46
6 2013-10-03 18:34:37 2013-10-03 18:34:47
7 2013-10-03 18:34:38 2013-10-03 18:34:48
8 2013-10-03 18:34:39 2013-10-03 18:34:49
9 2013-10-03 18:34:40 2013-10-03 18:34:50

私の質問 - リスト内包表記を使用する必要のないこれを行うパンダ固有の方法はありますか、それともこれが唯一の方法ですか?

タイムスタンプを処理するもう 1 つの方法は、DateTimeIndex を使用してから、ローカライズ メソッドを使用して目的のタイムゾーンに変換することです。ただし、この方法では、列をインデックスにする必要があるため、1 つの列に対してのみ実行できます。DateTimeIndex の理解が間違っている場合は、修正してください。また、これらの列をインデックスにする必要はありません。

では、パンダを使用してこれを行うより良い方法はありますか?

アップデート

In [52]: df['start_time'] = pd.DatetimeIndex(pd.to_datetime(df['start_time'],unit='s'),tz='UTC').tz_convert('Asia/Kolkata')

In [53]: df
Out[53]: 
     end_time          start_time
0  1380805481 2013-10-03 13:04:31
1  1380805482 2013-10-03 13:04:32
2  1380805483 2013-10-03 13:04:33
3  1380805484 2013-10-03 13:04:34
4  1380805485 2013-10-03 13:04:35
5  1380805486 2013-10-03 13:04:36
6  1380805487 2013-10-03 13:04:37
7  1380805488 2013-10-03 13:04:38
8  1380805489 2013-10-03 13:04:39
9  1380805490 2013-10-03 13:04:40

引数として「Asia/Kolkata」を指定した後でも、GMT + 5.30 が必要な場合でも、GMT 時間が表示されます。何か不足していますか?

ローカル タイムゾーンで時刻を表示するには、両方の列を変換する必要があります。DateTimeIndex の結果は、インデックスとして設定した場合にのみ表示されます。

In [55]: t = pd.DatetimeIndex(pd.to_datetime(df['start_time'],unit='s'),tz='UTC').tz_convert('Asia/Kolkata')

In [59]: df.set_index(t, inplace=True)

In [60]: df
Out[60]: 
                             end_time          start_time
2013-10-03 18:34:31+05:30  1380805481 2013-10-03 13:04:31
2013-10-03 18:34:32+05:30  1380805482 2013-10-03 13:04:32
2013-10-03 18:34:33+05:30  1380805483 2013-10-03 13:04:33
2013-10-03 18:34:34+05:30  1380805484 2013-10-03 13:04:34
2013-10-03 18:34:35+05:30  1380805485 2013-10-03 13:04:35
2013-10-03 18:34:36+05:30  1380805486 2013-10-03 13:04:36
2013-10-03 18:34:37+05:30  1380805487 2013-10-03 13:04:37
2013-10-03 18:34:38+05:30  1380805488 2013-10-03 13:04:38
2013-10-03 18:34:39+05:30  1380805489 2013-10-03 13:04:39
2013-10-03 18:34:40+05:30  1380805490 2013-10-03 13:04:40

両方の列に対してどのようにすればよいですか?

4

2 に答える 2

1

使用するapply

df['start_time'] = df['start_time'].apply(lambda x: dt.datetime.fromtimestamp(x))
df['end_time'] = df['end_time'].apply(lambda x: dt.datetime.fromtimestamp(x))

これはあなたが望むものを達成します

于 2013-10-03T13:36:12.060 に答える