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

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

詳細はこちら
DateTime

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

5回答

2882閲覧

午前0時から午前3時を24時や27時として扱いたい

Fantasy_Euphony

総合スコア9

DateTime

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

1クリップ

投稿2019/11/25 10:13

'20190801-040000'のような文字列をpythonのdatetimeライブラリのstrptimeを使用して
'2019-08-01 4:00:00'のような時間に直すことができると思いますが、
'20190801-040000''2019-07-31 27:00:00'のような表記にで変換するにはどうすればよいでしょうか?

Python3.7.4

1from datetime import datetime as dt 2 3dates = "20190823-074000" 4dates = dates.replace("-", "") 5print(dt.strptime(dates, "%Y%m%d%H%M%S"))

↑だとうまくいきますが、

Python3.7.4

1from datetime import datetime as dt 2 3dates = "20190823-274000" 4dates = dates.replace("-", "") 5print(dt.strptime(dates, "%Y%m%d%H%M%S"))

だと、ValueError: unconverted data remains: 00のエラーが出てしまうので、
なにか良い方法があれば教えていただけると幸いです。

環境
Python 3.7.4
anaconda

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答5

0

文字列の表記が24時を超えている時間の場合、24時を超えた時間を引いておき、あとから timedelta で足せば、datetime 型に変換できます。

例えば、20190823-274000 の場合、20190823-234000 + 4時間なので、20190823-234000 を strptime で datetime に変換してから、4時間分をあとから足します。

python

1import re 2from datetime import datetime, timedelta 3 4s = "20190823-274000" 5 6hour = s[9:11] 7if int(hour) >= 24: 8 # 24 時を超えた時間の場合 9 remain = int(hour) - 23 # 24時を超えた時間 10 # 時間のところを23に置き換えて、あとから足す 11 valid_s = s[:9] + "23" + s[11:] 12 date = datetime.strptime(valid_s, "%Y%m%d-%H%M%S") + timedelta(hours=remain) 13else: 14 date = datetime.strptime(s, "%Y%m%d-%H%M%S") 15 16print(date) # 2019-08-24 03:40:00

投稿2019/11/25 10:52

編集2019/11/25 10:53
tiitoi

総合スコア21956

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

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

0

python

1from datetime import datetime 2from datetime import timedelta 3 4dates = "20190823-274000" 5date, time = dates.split("-") 6delta = timedelta(hours=int(time[:2]), minutes=int(time[2:4]), seconds=int(time[4:])) 7print(datetime.strptime(date, "%Y%m%d") + delta)

投稿2019/11/25 14:29

YouheiSakurai

総合スコア6142

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

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

0

te2jiさんの案をコード化

python

1from datetime import datetime 2from datetime import timedelta 3 4dt = datetime.strptime("20190823-034000", "%Y%m%d-%H%M%S") - timedelta(hours=4) 5dt_str = "{0:%Y-%m-%d} {1:02}:{2:02}:{3:02}".format(dt, dt.hour + 4, dt.minute, dt.second) 6 7print(dt_str)

投稿2019/11/26 01:09

barobaro

総合スコア1286

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

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

退会済みユーザー

退会済みユーザー

2019/11/26 02:34

24時間表記から28時間表記にするときは、4時間引いたdatetimeの時間に直接4足したこちらの方がいいですね
barobaro

2019/11/26 02:52

そうなりますね。 私はベストアンサーは不要ですので他の方にお願いします。
guest

0

数字間違ってたので修正w

入力時間から3時間引いて変換し、変換後の時間に3足します。
入力時間から4時間引いて変換し、変換後の時間に4足します。

投稿2019/11/25 18:03

編集2019/11/26 02:40
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/11/26 02:49

そこは5かもしれないので、気にしなくてもいいと思いますよ笑 私は例にある時間が3だと足りなかったから4にしただけです
guest

0

とりあえず質問が最初28時間表記の文字列表記ができないと言ってるように見えたのに、コードでは28時間表記の文字列からdatetimeが生成できない話になってたので、一応両方向で変換させるサンプル書いてみました。

Python

1from datetime import datetime 2from datetime import timedelta 3 4delta = 4 5deltahour = timedelta(hours=delta) 6form = '%Y%m%d-%H%M%S' 7strdate = '20190823-034000' 8 9# 24時間表記→28時間表記 10fortime = datetime.strptime(strdate, form) 11fordate = fortime - deltahour 12strdate = '{:04n}{:02n}{:02n}-{:02n}{:02n}{:02n}'.format(fordate.year, fordate.month, fordate.day, (fortime.hour+24-delta)%24+delta, fortime.minute, fortime.second) 13print(strdate) 14 15# 28時間表記→24時間表記 16hour = int(strdate[9:11]) 17if hour >= 24: 18 deltaday = int(hour/24) 19 strdate = strdate[:9] + "{:02n}".format(hour%24) + strdate[11:] 20else: 21 deltaday = 0 22newdatetime = datetime.strptime(strdate, form) + timedelta(days=deltaday) 23strdate = newdatetime.strftime(form) 24print(strdate)

投稿2019/11/25 19:03

編集2019/11/26 02:59
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問