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

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

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

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

Q&A

解決済

2回答

962閲覧

DataFrameの文字列操作について

jun.k

総合スコア28

Python 3.x

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

0グッド

0クリップ

投稿2017/09/07 08:52

Python初めて3カ月程度の初心者です。jupyter notebookを使っています。

とあるデータベースから取り込んだ時系列データdf1の'Date-Time'列の表示形式が'2007-01-03T13:00:00.000000000Z'となっているので、これをdatetime型にしたいと考えておりまして、下記コードを組んだのですがうまくいきません。

for row in df1['Date-Time']:
row.replace('T',' ')
row.replace('.000000000Z','')
datetime.strptime(row,'%Y-%m-%d %H:%M:%S')

エラーコードは最後の行の型がmatchしないと言っているので、replaceがうまくいっていないと思うのですが。

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

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

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

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

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

guest

回答2

0

ベストアンサー

pandas.to_datetime() をお使いください。

ISO-8601フォーマット であれば、特にフォーマットを指定しなくでもパースできるかと思います。

Python

1import pandas as pd 2 3df = pd.DataFrame({'Date-Time':['2007-01-03T13:00:00.000000000Z']}) 4print(df) 5# => Date-Time 6# 0 2007-01-03T13:00:00.000000000Z 7 8# 文字列を datetimeに変換 9df['Date-Time'] = pd.to_datetime(df['Date-Time']) 10 11# データの確認 12print(df) 13# => Date-Time 14# 0 2007-01-03 13:00:00 15 16# 型の確認 17print(df['Date-Time'].dtype) 18# => datetime64[ns]

投稿2017/09/07 09:15

magichan

総合スコア15898

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

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

jun.k

2017/09/07 09:30

ありがとうございます!!。一発ですね。この表記がISO-8601ということも勉強になりました。
guest

0

いきなり結論
最初に、どのように書き換えればよいか書いてしまおうと思います。

Python

1>>> row = '2007-01-03T13:00:00.000000000Z' 2>>> row = row.replace('T', ' ') 3>>> row = row.replace('.000000000Z', '') 4>>> my_date = datetime.strptime(row,'%Y-%m-%d %H:%M:%S') 5>>> my_date 6datetime.datetime(2007, 1, 3, 13, 0)

修正の過程
上手くいかない原因の第一は、replaceの返り値を受け取っていないことです。
文字列はイミュータブルなので、メソッドを噛ませても変化しません。

Python

1# 今までの方法 2>>> row = '2007-01-03T13:00:00.000000000Z' 3>>> row.replace('T', '') 4'2007-01-0313:00:00.000000000Z' 5>>> row 6'2007-01-03T13:00:00.000000000Z' 7 8# 返り値を受け取ると 9>>> row = row.replace('T', '') 10>>> row 11'2007-01-0313:00:00.000000000Z'

これを踏まえてコードを書き換えても、まだエラーが出ます。

Python

1>>> row = '2007-01-03T13:00:00.000000000Z' 2>>> row = row.replace('T', '') 3>>> row = row.replace('.000000000Z', '') 4>>> datetime.strptime(row,'%Y-%m-%d %H:%M:%S') 5Traceback (most recent call last): 6 File "<stdin>", line 1, in <module> 7 File "C:\ProgramData\Miniconda3\lib\_strptime.py", line 565, in _strptime_datetime 8 tt, fraction = _strptime(data_string, format) 9 File "C:\ProgramData\Miniconda3\lib\_strptime.py", line 362, in _strptime 10 (data_string, format)) 11ValueError: time data '2007-01-0313:00:00' does not match format '%Y-%m-%d %H:%M:%S' 12 13# 上手くいかないのでrowを確認してみる 14>>> row 15'2007-01-0313:00:00'

rowを出力してみると、dayとhourの数値が隣接してしまっていることがわかります。
よって、Tから空文字列に置換するのではなく、空白に置換しましょう。

以下、冒頭のコードを再掲したものです。

Python

1>>> row = '2007-01-03T13:00:00.000000000Z' 2>>> row = row.replace('T', ' ') 3>>> row = row.replace('.000000000Z', '') 4>>> my_date = datetime.strptime(row,'%Y-%m-%d %H:%M:%S') 5>>> my_date 6datetime.datetime(2007, 1, 3, 13, 0)

投稿2017/09/07 08:59

編集2017/09/07 09:16
LouiS0616

総合スコア35658

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

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

jun.k

2017/09/07 09:21

ありがとうございます。上記を踏まえて書き換えてみたのですが、エラー子は出ないもののやはり変化ありませんでした。教えて頂いた通り、一旦DataFrameではなくて文字列で試したらうまくいったのですが。
LouiS0616

2017/09/07 09:31

あれ、なんでですかね... strptimeの返り値はちゃんと受け取ってますかね?
LouiS0616

2017/09/07 09:32

いちおう、『なんで上手くいかないのか』という目線で回答を書きましたが、 特に事情がないのであればmagichan様の回答に従うのが良いかと思います。 既にあるものを上手く利用した方が良いです。
jun.k

2017/09/07 09:33

上の方にご指摘受けたとおり解決いたしました。でも文字列のイミュータブル性など忘れていたことにも気づいたので勉強になりました。わかりやすいご回答ありがとうございました!!。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問