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

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

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

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

Q&A

解決済

2回答

617閲覧

pythonにおける時間の出力に関する構文を理解したい

tetsu1231

総合スコア9

Python

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

0グッド

0クリップ

投稿2023/02/22 00:19

実現したいこと

pythonにおける時間の出力に関する構文を理解したい

前提

以下のソースコードは、レンタルサイクルの利用時間から、請求金額と利用明細を出力するためのコードです。

※初心者なので、質問をうまく言語化出来ていないかもしれないのですが、温かい目でご回答いただけると幸いです。

start = datetime.strptime(f"{cols[0]} {cols[1]}", "%Y/%m/%d %H:%M")
details.append(f"{start:%m-%d, %H:%M}, {end:%H:%M}, {rental_hours}時間")

上記、二つのコードを見比べたときに、両者とも時間を出力するフォーマットではあるものの、
前者は"{cols[0]} {cols[1]}"%とY/%m/%d %H:%Mを繋ぐ間に”,”を書いています。
後者はstartと%m-%dを繋ぐ間に、”:”を書いています。
同じ時間の出力でも、フォーマットが違う理由を教えていただきたいです。

該当のソースコード

from datetime import datetime # 1時間あたりのレンタル代金 RENTAL_PRICE = 400 # レンタル時間の合計計算用変数 total_time = 0 details = [] # ファイル「input/bicycle.csv」を読み込む with open("input/bicycle.csv", encoding="utf-8") as f: # ヘッダー行を読み飛ばす f.readline() for row in f: # 末尾の改行を除去 row = row.rstrip() # カンマ区切りで各値を分割する cols = row.split(",") # レンタル開始日時 start = datetime.strptime(f"{cols[0]} {cols[1]}", "%Y/%m/%d %H:%M") # レンタル終了日時 end = datetime.strptime(f"{cols[0]} {cols[2]}", "%Y/%m/%d %H:%M") # レンタル時間を計算する rental_hours = (end - start).total_seconds() / 3600 # 合計時間に加算する total_time += rental_hours # 出力用文字列作成と追加 details.append(f"{start:%m-%d, %H:%M}, {end:%H:%M}, {rental_hours}時間") # 請求金額を計算する invoice = int(total_time * RENTAL_PRICE) # 合計レンタル時間を表示 print(f"合計レンタル時間は、{total_time}時間") # 請求金額を表示 print(f"請求金額は、{invoice:,}円") print("---レンタルの詳細---") print("日付, 開始時刻, 終了時刻, レンタル時間") for detail in details: print(detail)
python

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

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

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

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

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

guest

回答2

0

前者は"{cols[0]} {cols[1]}"%とY/%m/%d %H:%Mを繋ぐ間に”,”を書いています。
後者はstartと%m-%dを繋ぐ間に、”:”を書いています。

全く構文が理解できていないのでは?
前者は、strptimeというメソッドに2つの引数 f"{cols[0]} {cols[1]}""%Y/%m/%d %H:%M"を与えて呼び出しています。
関数やメソッドの引数が複数ある場合は、カンマで区切ります。

後者は、フォーマット済み文字列リテラルで、{}内の値を書式に従って文字列化するという機能です。
startが値でコロンに続けて書式として%m-%d, %H:%Mを指定しています。
書式がどんな意味を持つかは、値の属するクラス次第で、datetimeクラスの場合は上記で月-日, 時:分に変換されます。

どういった文法規則に基づいて書かれているのかを意識しましょう。

投稿2023/02/22 01:21

編集2023/02/22 02:35
otn

総合スコア86295

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

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

0

ベストアンサー

まったく目的が違うものに対して「なんで違うのだろう」と言っている感じです。

上記、二つのコードを見比べたときに、両者とも時間を出力するフォーマットではあるものの、

違います。前者は cols[0] cols[1] に入っている文字列形式の日付を解析して datetime 型に変換するコードです。フォーマットは入力を解析するために使います。出力ではありません。

前者は"{cols[0]} {cols[1]}"%とY/%m/%d %H:%Mを繋ぐ間に”,”を書いています。

関数 strptime() の2つの引数を区切るための , です。日付フォーマットには関係ありません。

後者はstartと%m-%dを繋ぐ間に、”:”を書いています。

フォーマット済み文字列リテラルで変数 start を埋め込んでいて、その書式として %m-%d, %H:%M を指定しています。 : はフォーマット済み文字列リテラル内の置換フィールドで書式を指定するための記号です。

書式指定文字列の文法

replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

投稿2023/02/22 01:32

編集2023/02/22 01:36
int32_t

総合スコア21929

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問