🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Python 3.x

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

Q&A

解決済

2回答

1387閲覧

numpyでdatatimeを使って二種類の時間を取得したい

MasaMasa_T

総合スコア1

DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Python 3.x

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

0グッド

1クリップ

投稿2021/01/03 06:36

編集2021/01/03 08:13

前提・実現したいこと

Python,numpyでdatatimeを使って二種類の時間を取得したい

発生している問題・エラーメッセージ

時間データに二種類のフォーマットが存在している
データのフォーマットは
"2020-10-03 00:00:00"
"2020-10-03 00:00:00.1"
のようになっています.ゼロ秒の時はミリ秒が存在しないが,そのほかはミリ秒がついています

エラーメッセージ
time data '"2020-11-01 00:00:00"' does not match format '%Y-%m-%d %H:%M:%S.%f'

該当のソースコード

python

1time_fmt1='"'+"%Y-%m-%d %H:%M:%S.%f"+'"' 2 3for i in range(data.shape[0]): 4 if len(data[i,0])<21: 5 data[i,0]=data[i,0]+".0" # if the second does not have decimal value 6 7date_time = [datetime.datetime.strptime(x,time_fmt1) for x in data[:,0]] 8 date_time = np.array([date_time]).T

試したこと

ミリ秒有無を判断して、ミリ秒なしの場合は'.0'を末尾に足してから処理する
ミリ秒有無を判断して、どちらかによってstrptimeの書式を切り替える

のどちらかで対処できるかと考えているのですが,前者の方法を試しましたが,できなくて困っています。どなたか知恵をお貸しください。

補足情報(FW/ツールのバージョンなど)

python 3.

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

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

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

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

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

guest

回答2

0

以下の関数をそのまま使うか、適当にアレンジして使ってください。

python

1>>> import numpy as np 2>>> import datetime 3>>> def convdt(x): 4... time_fmt1 = '%Y-%m-%d %H:%M:%S' 5... time_fmt2 = '%Y-%m-%d %H:%M:%S.%f' 6... try: 7... return datetime.datetime.strptime(x,time_fmt1) 8... except Exception: 9... return datetime.datetime.strptime(x,time_fmt2) 10... 11>>> print(convdt("2020-10-03 00:00:00")) 122020-10-03 00:00:00 13>>> print(convdt("2020-10-03 00:00:00.1")) 142020-10-03 00:00:00.100000

投稿2021/01/03 10:35

ppaul

総合スコア24670

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

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

0

ベストアンサー

if len(data[i,0])<21:
ではヒットしないように思います。
また
+".0"
は最後の " をはずしてから追加しないといけませんね。

Python

1TGT_LEN = len('"2020-10-03 00:00:00"') # 21 2TOP_LEN = len('"2020-10-03 00:00:00') # 20 3 4time_fmt1='"'+"%Y-%m-%d %H:%M:%S.%f"+'"' 5 6for i in range(data.shape[0]): 7 #if len(data[i,0])<21: 8 if len(data[i,0])<=TGT_LEN: 9 #data[i,0]=data[i,0]+".0" 10 data[i,0]=data[i,0][:TOP_LEN]+'.0"' # if the second does not have decimal value 11 12date_time = [datetime.datetime.strptime(x,time_fmt1) for x in data[:,0]] 13date_time = np.array([date_time]).T

投稿2021/01/03 09:39

lehshell

総合スコア1156

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

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

MasaMasa_T

2021/01/03 10:31

回答ありがとうございます. 時間のファイルは.datファイルの中に入っており,TGT_LENのようにすることができません. ファイルの1行目に時間があり,それが何列も続いています. ただ,+'.0"'にしてみると, for i in range(data.shape[0]): if len(data[i,0])<=20: data[i,0]=data[i,0]+'.0"' print(data[10,0]) >>"2020-10-03 00:00:00".0 となりました. lehshell様のように"の中に入れればよいのですが... 何か方法はないでしょうか よろしくお願いします.
lehshell

2021/01/03 11:04

意味がよくわかりません。 TGT_LEN と TOP_LEN は固定フォーマットの代表値と用意しているに過ぎません。.datファイルは不要です。 それとも時刻フォーマットが固定ではないということですか? > data[i,0]=data[i,0]+'.0"' は data[i,0]=data[i,0][:TOP_LEN]+'.0"' または data[i,0]=data[i,0][:20]+'.0"' としないと中に入れられませんよね。
MasaMasa_T

2021/01/03 11:28

申し訳ございません.勘違いでした. 解決することができました 本当にありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問