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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア15898
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総合スコア35658
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/07 09:31
2017/09/07 09:32
2017/09/07 09:33
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/07 09:30