Scientific Computing with Pythonの続き
freeCodeCampでコツコツPythonを勉強しています。
前回の記事では、Python for EverybodyとArithmetic Formatterに挑戦しました。今回はTime Calculatorに挑戦します。
- Python for Everybody
- Scientific Computing with Python Projects
- Arithmetic Formatter
- Time Calculator(今回はここ)
- Budget App
- Polygon Area Calculator
- Probability Calculator
2問目:Time Calculator
最終的に欲しいものはadd_time
メソッドで、動きは以下の通り
add_time("3:00 PM", "3:10")
# Returns: 6:10 PM
add_time("11:30 AM", "2:32", "Monday")
# Returns: 2:02 PM, Monday
add_time("11:43 AM", "00:20")
# Returns: 12:03 PM
add_time("10:10 PM", "3:30")
# Returns: 1:40 AM (next day)
add_time("11:43 PM", "24:20", "tueSday")
# Returns: 12:03 AM, Thursday (2 days later)
add_time("6:30 PM", "205:12")
# Returns: 7:42 AM (9 days later)
実装方針
- 第一引数を
datetime
に変換し、第二引数は:
で時間と分に分けて足していく。 - 曜日に関しては前処理で
大文字+小文字
に変換する(tueSdayなどがあったため)。 - 出力の中の括弧内の文字は、第一引数で入力した時間との日付の差分を計算し、1以下と1より大きい時で分ける。
個人的ポイント: 曜日を含めた日時の受け取り
日時と文字列を相互に変換するメソッドとして
-
strptime()
: 文字列 -> 日時への変換 -
strftime()
: 日時 -> 文字列への変換
があります。strftime()
では%A
や%a
などの書式化コードを使うことで曜日を出力することができます。また、AM/PMのような12時間表の場合も%p
という書式化コードがあります。
import datetime
dt = datetime.datetime(2020, 7, 13)
print(dt.strftime('%A, %a'))
# Monday, Mon
しかし、strptime()
では曜日を%a
などで受け取ることができませんでした。(年月が決まらないと曜日なんてわからないからね…)
import datetime
dt_str = "7:49 Wednesday"
format = "%H:%M %A"
dt = datetime.strptime(dt_str, format)
print(dt.strftime("%H:%M %A"))
# 07:49 Monday
そこで、曜日のリストを作って実装をしてみました。
weeks = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
def get_week_by_diff(week, diff):
index = weeks.index(week)
target_index (index + diff) % len(weeks)
return weeks[target_index]
最後に
前回の問題より簡単だった気がした。
次の問題はBudget Appです。