質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

385閲覧

pandas の時間を変換したい

sho_shin_sha

総合スコア12

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2018/04/01 12:56

編集2018/04/01 13:27

pandasのdataframeに入れた時間(str型)を変換(いわゆるdatetimeなどの時系列データの形)にしたいです。
to_datetime()を試してみましたが、うまく変換できませんでした。

コードのは私がかいたものではなく、元ネタは
https://github.com/mabuix/bitFlyer/blob/master/bitflyer_scalping_volume_bot.py
です。

python

1# coding: utf-8 2from pubnub.callbacks import SubscribeCallback 3from pubnub.enums import PNStatusCategory 4from pubnub.pnconfiguration import PNConfiguration 5from pubnub.pubnub_tornado import PubNubTornado 6from pubnub.pnconfiguration import PNReconnectionPolicy 7import datetime 8import pandas as pd 9import numpy as np 10from tornado import gen 11 12c = PNConfiguration() 13c.subscribe_key = 'sub-c-52a9ab50-291b-11e5-baaa-0619f8945a4f' 14c.reconnect_policy = PNReconnectionPolicy.LINEAR 15pubnub = PubNubTornado(c) 16 17df = pd.DataFrame(index=['datetime'], 18 columns=['id', 19 'side', 20 'price', 21 'size', 22 'exec_date', 23 'buy_child_order_acceptance_id', 24 'sell_child_order_acceptance_id']) 25 26 27@gen.coroutine 28def main(channels): 29 class Callback(SubscribeCallback): 30 def presence(self, pubnub, presence): 31 pass 32 33 def status(self, pubnub, status): 34 if status.category == PNStatusCategory.PNUnexpectedDisconnectCategory: 35 pass 36 elif status.category == PNStatusCategory.PNConnectedCategory: 37 pass 38 elif status.category == PNStatusCategory.PNReconnectedCategory: 39 pass 40 elif status.category == PNStatusCategory.PNDecryptionErrorCategory: 41 pass 42 43 def message(self, pubnub, message): 44 global df 45 db = message.message 46 pd.Series(db) 47 df = df.append(db,ignore_index=True) 48 #indexを指定する 49 df.index = df['exec_date'] 50 #いらない列を削除する。 51 del df['buy_child_order_acceptance_id'] 52 del df['sell_child_order_acceptance_id'] 53 del df['id'] 54 #時刻を変換する。 55 56 # 約定時間を日本時間に修正 57 58 print(df) 59 60 61 62 s = Callback() 63 pubnub.add_listener(s) 64 pubnub.subscribe().channels(channels).execute() 65 66 67if __name__ == '__main__': 68 channels = [ 69 'lightning_executions_FX_BTC_JPY', 70 71 ] 72 main(channels) 73 pubnub.start() 74

試したこと
pd.to_datetime(df['exec_date'])
を試みましたが、うまくいきませんでした。

変換できなければ、データを取得した時間を別途追加する方法でもかまいません。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tachikoma

2018/04/01 13:45

1. exec_dateの具体的な中身を教えてください。
tachikoma

2018/04/01 13:47

2. うまく行かなかった、という点をもう少し具体的に説明してください。エラーが出たのか、変換はされるがおかしな時刻が出てきた、等。
tachikoma

2018/04/01 13:48

おかしな数値が出てきた場合は、期待する結果と実際に得られた結果を追記していただけないでしょうか。
sho_shin_sha

2018/04/01 13:56

表示される時間が「2018-04-01T13:52:06.5675969Z」のような形なのです。print(type())で確認したところ、<class 'pandas.core.series.Series'>にです。
sho_shin_sha

2018/04/01 13:58

exec_dateの中身は時系列データになります。時間、価格、サイズ、などが入力されています。
sho_shin_sha

2018/04/01 14:00

期待する結果は、10:15:14 のように(10時15分14秒)のような形にしたいです。その後、経過時間に変換する予定です。
sho_shin_sha

2018/04/01 14:02

DatetimeIndexに変換するにはどうすればよいでしょうか?
sho_shin_sha

2018/04/01 14:06

データをDataFrame二追加した後で、pd.to_datetime()を実行しました。その後、typeを確認したところ、<class 'pandas.core.series.Series'>になっており、pandasのdatetimeに変換されていないと思います。
tachikoma

2018/04/01 14:27

typeよりはdf.info()で中身の型をチェックするのがいいです。datetimeになっていたとしても結局はseriesなので、変化が分からないです。
guest

回答1

0

ベストアンサー

確認なのですが、もとのソースコードでは下記のものを使っています。質問者さんの場合も、これと同様のコードを試してみた、という理解でよろしいでしょうか。

Python

1df_new['exec_date'] = pd.to_datetime(df_new['exec_date']) + timedelta(hours=9)

投稿2018/04/01 14:30

tachikoma

総合スコア3601

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sho_shin_sha

2018/04/01 14:42

はい。試しております。上記元ソースにおいても、時間はミリ秒まで表示されておりました。今、表示されている時間とは別に、datetime.now()にて別途時刻を取得し、データに追加(元のデータは削除)する形で、なんとか対処できたと思われます。。。お時間をとらせてしまいました。ありがとうございます。基本的な操作の理解が及んでいないと思いました。。。。
tachikoma

2018/04/01 14:51

もしかしたらpd.to_datetimeの結果をもとのデータフレームに代入していなかった、ということはないですか? df['exec_date'] = pd.to_datetime(df['exec_date']) として、df['exec_date']がdatetime型になっていることを確認してから df.index = df['exec_date'] とするのがいいと思いますが、いかがでしょう。
tachikoma

2018/04/01 14:53

pandasの場合、変換結果を明示的に元のDataFrameに代入するか、inplaceというオプション引数をTrueにしない限り、DataFrameの中身は変更されません。その点にだけひとまずはご注意を。
sho_shin_sha

2018/04/02 00:35

ありがとうございます。それも試してみましたが、datetime型が自動的にseries型になっていたと思います。。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問