KR_DateTime - somaz94/python-study GitHub Wiki
κ°μ₯ μΌλ°μ μΌλ‘ μ¬μ©λλ λ μ§/μκ° μ²λ¦¬ λͺ¨λμ΄λ€.
from datetime import datetime, date, time, timedelta
# νμ¬ λ μ§μ μκ°
now = datetime.now()
print(now) # 2024-01-20 15:30:00.123456
# νΉμ λ μ§/μκ° μμ±
dt = datetime(2024, 1, 20, 15, 30)
print(dt) # 2024-01-20 15:30:00
# λ μ§ λΆλ¦¬
print(dt.year) # 2024
print(dt.month) # 1
print(dt.day) # 20
print(dt.hour) # 15
print(dt.minute) # 30
# dateμ time κ°μ²΄ μμ±
today = date.today()
current_time = time(14, 30, 0)
# datetime κ°μ²΄ μ‘°ν©
combined = datetime.combine(today, current_time)
β
νΉμ§:
- λ μ§/μκ° μμ±
- μμ± μ κ·Ό
- νμ¬ μκ° μ‘°ν
- λ μ§μ μκ° λΆλ¦¬ λ° μ‘°ν©
datetime κ°μ²΄μ timedelta κ°μ²΄λ₯Ό μ¬μ©νμ¬ λ μ§μ μκ° μ°μ°μ μνν μ μλ€.
# timedelta μ¬μ©
now = datetime.now()
tomorrow = now + timedelta(days=1)
next_week = now + timedelta(weeks=1)
two_hours_later = now + timedelta(hours=2)
# λ μ§ μ°¨μ΄ κ³μ°
date1 = date(2024, 1, 1)
date2 = date(2024, 12, 31)
diff = date2 - date1
print(diff.days) # 365
# λ³΅ν© timedelta μμ±
complex_delta = timedelta(
days=2,
hours=3,
minutes=45,
seconds=30
)
# timedelta μμ±
print(complex_delta.total_seconds()) # μ΄ λ¨μ μ΄ μκ°
β
νΉμ§:
- λ μ§ κ° μ°μ°
- μκ° κ°κ²© κ³μ°
- timedelta νμ©
- λ³΅ν© μκ° κ°κ²© μ²λ¦¬
- μ΄ λ¨μ λ³ν
λ μ§μ μκ°μ λ€μν νμμ λ¬Έμμ΄λ‘ λ³ννκ±°λ λ°λλ‘ λ¬Έμμ΄μμ λ μ§/μκ° κ°μ²΄λ‘ λ³νν μ μλ€.
# λ μ§/μκ° νμν
now = datetime.now()
formatted = now.strftime("%Y-%m-%d %H:%M:%S")
print(formatted) # 2024-01-20 15:30:00
# λ¬Έμμ΄μ λ μ§/μκ°μΌλ‘ νμ±
date_string = "2024-01-20 15:30:00"
parsed = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
# μ£Όμ νμ μ§μ μ
# %Y: μ°λ (2024)
# %m: μ (01-12)
# %d: μΌ (01-31)
# %H: μκ° (00-23)
# %M: λΆ (00-59)
# %S: μ΄ (00-59)
# %A: μμΌ μ΄λ¦
# %B: μ μ΄λ¦
# %c: νμ§νλ λ μ§μ μκ°
# %x: νμ§νλ λ μ§
# %X: νμ§νλ μκ°
# %j: λ
μ€ μΌ(001-366)
# %W: λ
μ€ μ£Ό(00-53)
# %Z: μκ°λ μ΄λ¦
# λ€μν νμ μμ
print(now.strftime("%Yλ
%mμ %dμΌ %Hμ %MλΆ")) # 2024λ
01μ 20μΌ 15μ 30λΆ
print(now.strftime("%A, %B %d, %Y")) # Saturday, January 20, 2024
print(now.strftime("%c")) # νμ§νλ νν
print(now.strftime("μ£Όμ°¨: %W, μΌμ°¨: %j")) # μ£Όμ°¨: 03, μΌμ°¨: 020
β
νΉμ§:
- λ€μν νμ μ§μ
- λ¬Έμμ΄ λ³ν
- μ μ°ν νμ±
- κ΅μ ν μ§μ
- μ¬μ©μ μ μ νμ
pytz λͺ¨λμ μ¬μ©νμ¬ λ€μν μκ°λ κ°μ λ³νκ³Ό μ²λ¦¬λ₯Ό ν μ μλ€.
from datetime import datetime
import pytz
# μκ°λ λͺ©λ‘
print(pytz.all_timezones)
# νΉμ μκ°λμ νμ¬ μκ°
seoul_tz = pytz.timezone('Asia/Seoul')
seoul_time = datetime.now(seoul_tz)
print(seoul_time)
# μκ°λ λ³ν
utc_time = datetime.now(pytz.UTC)
local_time = utc_time.astimezone(seoul_tz)
# μκ°λ μΈμ λ μ§/μκ° κ°μ²΄ μμ±
aware_dt = seoul_tz.localize(datetime(2024, 1, 20, 15, 30))
# μ¬λ¬ μκ°λ λΉκ΅
timezones = [
'America/New_York',
'Europe/London',
'Asia/Tokyo',
'Australia/Sydney'
]
utc_now = datetime.now(pytz.UTC)
print(f"UTC μκ°: {utc_now.strftime('%Y-%m-%d %H:%M:%S %Z')}")
for tz_name in timezones:
tz = pytz.timezone(tz_name)
local_time = utc_now.astimezone(tz)
print(f"{tz_name}: {local_time.strftime('%Y-%m-%d %H:%M:%S %Z')}")
β
νΉμ§:
- μκ°λ λ³ν
- UTC μ§μ
- pytz νμ©
- μκ°λ μΈμ κ°μ²΄
- λ€μ€ μκ°λ λΉκ΅
μ€μ κ°λ°μμ μμ£Ό μ¬μ©λλ λ μ§/μκ° μ²λ¦¬ μμ λ€.
from datetime import datetime, date, timedelta
import pytz
# λμ΄ κ³μ° ν¨μ
def calculate_age(birthdate):
today = date.today()
age = today.year - birthdate.year
if today.month < birthdate.month or \
(today.month == birthdate.month and today.day < birthdate.day):
age -= 1
return age
birthdate = date(1990, 6, 15)
age = calculate_age(birthdate)
print(f"λμ΄: {age}μΈ")
# νΉμ κΈ°κ° λ΄ λͺ¨λ μμμΌ μ°ΎκΈ°
def get_all_mondays(start_date, end_date):
mondays = []
current = start_date
# μμμΌμ΄ μμμΌμ΄ μλλ©΄ λ€μ μμμΌμ μ°Ύμ
if current.weekday() != 0: # 0μ μμμΌ
days_until_monday = 7 - current.weekday()
current += timedelta(days=days_until_monday)
# μ’
λ£μΌκΉμ§ 7μΌμ© μ¦κ°νλ©° μμμΌ μΆκ°
while current <= end_date:
mondays.append(current)
current += timedelta(days=7)
return mondays
start = date(2024, 1, 1)
end = date(2024, 3, 31)
mondays = get_all_mondays(start, end)
print("2024λ
1μλΆν° 3μκΉμ§μ λͺ¨λ μμμΌ:")
for monday in mondays:
print(monday.strftime("%Y-%m-%d"))
# λ μ΄λ²€νΈ κ°μ κ²ΉμΉλ μκ° κ³μ°
def get_overlapping_duration(event1_start, event1_end, event2_start, event2_end):
latest_start = max(event1_start, event2_start)
earliest_end = min(event1_end, event2_end)
if latest_start >= earliest_end:
return timedelta(0) # κ²ΉμΉλ λΆλΆ μμ
return earliest_end - latest_start
# μ΄λ²€νΈ μκ° μ€μ
event1_start = datetime(2024, 1, 20, 10, 0)
event1_end = datetime(2024, 1, 20, 12, 0)
event2_start = datetime(2024, 1, 20, 11, 0)
event2_end = datetime(2024, 1, 20, 13, 0)
overlap = get_overlapping_duration(event1_start, event1_end, event2_start, event2_end)
print(f"κ²ΉμΉλ μκ°: {overlap}")
β
νΉμ§:
- λμ΄ κ³μ°
- λ μ§ λΉκ΅
- μμΌ κΈ°λ° νν°λ§
- κΈ°κ° κ³μ°
- μ΄λ²€νΈ μκ° μ²λ¦¬
μ μμ€ μκ° ν¨μμ μ±λ₯ μΈ‘μ μ μ μ©ν λͺ¨λμ΄λ€.
import time
# νμ¬ μκ° (μ λμ€ νμμ€ν¬ν)
timestamp = time.time()
print(f"νμ¬ νμμ€ν¬ν: {timestamp}")
# νμ¬ μκ° λ¬Έμμ΄
time_string = time.ctime()
print(f"νμ¬ μκ°: {time_string}")
# μ±λ₯ μΈ‘μ
def measure_performance(func, *args, **kwargs):
start = time.perf_counter() # κ³ ν΄μλ μ±λ₯ μΉ΄μ΄ν°
result = func(*args, **kwargs)
end = time.perf_counter()
execution_time = end - start
return result, execution_time
# μμ ν¨μ
def calculate_sum(n):
return sum(range(n))
result, execution_time = measure_performance(calculate_sum, 10000000)
print(f"κ²°κ³Ό: {result}, μ€ν μκ°: {execution_time:.6f}μ΄")
# μΌμ μ μ§
print("3μ΄ λκΈ° μμ...")
time.sleep(3)
print("λκΈ° μλ£!")
# ꡬ쑰체 μκ°
struct_time = time.localtime()
print(f"μ°λ: {struct_time.tm_year}")
print(f"μ: {struct_time.tm_mon}")
print(f"μΌ: {struct_time.tm_mday}")
print(f"μ: {struct_time.tm_hour}")
print(f"λΆ: {struct_time.tm_min}")
print(f"μ΄: {struct_time.tm_sec}")
print(f"μμΌ: {struct_time.tm_wday}") # 0μ μμμΌ
β
νΉμ§:
- νμμ€ν¬ν μ²λ¦¬
- μκ° μ§μ° (sleep)
- κ³ ν΄μλ μ±λ₯ μΈ‘μ
- μκ° κ΅¬μ‘°μ²΄ μ²λ¦¬
- μμ€ν μμ€ μκ° ν¨μ
Pythonμμ λ μ§μ μκ° μ²λ¦¬λ₯Ό μν μΆκ° λΌμ΄λΈλ¬λ¦¬μ κ³ κΈ κΈ°λ₯μ μ΄ν΄λ³Έλ€.
# dateutil λΌμ΄λΈλ¬λ¦¬ - κ°λ ₯ν λ μ§/μκ° νμ±κ³Ό μ°μ°
from dateutil import parser, rrule, relativedelta
from datetime import datetime
# μ μ°ν λ¬Έμμ΄ νμ±
dt = parser.parse("Jan 20, 2024")
print(dt) # 2024-01-20 00:00:00
dt = parser.parse("20-01-2024")
print(dt) # 2024-01-20 00:00:00
dt = parser.parse("2024/01/20 15:30:45")
print(dt) # 2024-01-20 15:30:45
# μλμ λ μ§ κ³μ°
now = datetime.now()
next_month = now + relativedelta.relativedelta(months=1)
previous_year = now - relativedelta.relativedelta(years=1)
next_birthday = now + relativedelta.relativedelta(month=6, day=15)
# 볡μ‘ν κ·μΉ κΈ°λ° λ μ§ λ°λ³΅
# λ§€μ 첫 λ²μ§Έ μμμΌ κ΅¬νκΈ°
mondays = list(rrule.rrule(
rrule.MONTHLY,
byweekday=rrule.MO(1), # λ§€μ 첫 λ²μ§Έ μμμΌ
dtstart=datetime(2024, 1, 1),
until=datetime(2024, 12, 31)
))
print("2024λ
λ§€μ 첫 λ²μ§Έ μμμΌ:")
for monday in mondays:
print(monday.strftime("%Y-%m-%d"))
# arrow λΌμ΄λΈλ¬λ¦¬ - μ¬μ©νκΈ° μ¬μ΄ λ μ§/μκ° μ²λ¦¬
import arrow
# μμ± λ° νμν
now = arrow.now()
print(now) # 2024-01-20T15:30:45.123456+09:00
# νμν
print(now.format("YYYY-MM-DD HH:mm:ss")) # 2024-01-20 15:30:45
# μκ°λ λ³ν
tokyo = now.to('Asia/Tokyo')
new_york = now.to('America/New_York')
# μλμ μκ°
tomorrow = now.shift(days=1)
last_week = now.shift(weeks=-1)
# μΈκ° μΉνμ νν
print(now.humanize()) # just now
print(tomorrow.humanize()) # in a day
print(last_week.humanize()) # a week ago
β
νΉμ§:
- μ μ°ν λ μ§ νμ±
- μλμ λ μ§/μκ° κ³μ°
- μ£ΌκΈ°μ λ μ§ μμ±
- λ€μν νμν μ΅μ
- μΈκ° μΉνμ μκ° νν
- κ³ κΈ μκ°λ μ²λ¦¬
λ°μ΄ν°λ² μ΄μ€ μμ€ν
κ³Ό μνΈμμ©ν λ λ μ§μ μκ°μ μ²λ¦¬νλ λ°©λ²μ μμλ³Έλ€.
import sqlite3
from datetime import datetime
# λ°μ΄ν°λ² μ΄μ€ μ°κ²°
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
# ν
μ΄λΈ μμ±
cursor.execute('''
CREATE TABLE IF NOT EXISTS events (
id INTEGER PRIMARY KEY,
name TEXT,
start_time TIMESTAMP,
end_time TIMESTAMP
)
''')
# λ μ§/μκ° λ°μ΄ν° μ½μ
def add_event(name, start_time, end_time):
cursor.execute(
"INSERT INTO events (name, start_time, end_time) VALUES (?, ?, ?)",
(name, start_time.strftime("%Y-%m-%d %H:%M:%S"), end_time.strftime("%Y-%m-%d %H:%M:%S"))
)
conn.commit()
# μ΄λ²€νΈ μΆκ°
add_event("νμ", datetime(2024, 1, 20, 14, 0), datetime(2024, 1, 20, 15, 0))
add_event("μν¬μ΅", datetime(2024, 1, 22, 9, 0), datetime(2024, 1, 24, 17, 0))
# λ μ§/μκ° κΈ°λ° μΏΌλ¦¬
def get_events_by_date(target_date):
cursor.execute(
"""
SELECT * FROM events
WHERE date(start_time) <= date(?) AND date(end_time) >= date(?)
""",
(target_date.strftime("%Y-%m-%d"), target_date.strftime("%Y-%m-%d"))
)
return cursor.fetchall()
# νΉμ λ μ§μ μ΄λ²€νΈ κ²μ
events = get_events_by_date(datetime(2024, 1, 22))
for event in events:
print(f"μ΄λ²€νΈ: {event[1]}, μμ: {event[2]}, μ’
λ£: {event[3]}")
# μ 리
conn.close()
β
νΉμ§:
- λ°μ΄ν°λ² μ΄μ€ λ μ§/μκ° μ μ₯
- λ μ§ νμ λ³ν
- μκ° κΈ°λ° μΏΌλ¦¬
- λ μ§ λ²μ κ²μ
- SQLκ³Ό Python μκ° κ°μ²΄ ν΅ν©
β
λͺ¨λ² μ¬λ‘:
- UTC μ¬μ© κΆμ₯ (νΉν μ¬λ¬ μκ°λ μ¬μ©μ λμ μ ν리μΌμ΄μ )
- ISO νμ νμ© (κ΅μ νμ€)
- μκ°λ λ³ν μ pytz λλ zoneinfo(Python 3.9+) μ¬μ©
- λ μ§ λΉκ΅λ date κ°μ²΄ μ¬μ©
- μκ° μΈ‘μ μ time.perf_counter() κ³ λ € (λμ μ νλ)
- λμ©λ λ μ§ μ²λ¦¬λ Pandas νμ©
- λ¬Έμμ΄ νμ±μλ dateutil.parser κ³ λ €
- μ¬μ©μ μΉνμ νμμλ arrow.humanize() νμ©
- DB μ μ₯ μ UTC μκ° μ¬μ© λ° νμ€ νμ μ€μ
- μ€λ κ³Ό μ€μ΄ κ³ λ € (νΉν μ²λ¬Ένμ κ³μ°)
- μμ¬μ λ μ§ λ€λ£° λ λ¬λ ₯ μμ€ν μ°¨μ΄ μΈμ§
- λ μ§/μκ° μ°μ° κ²°κ³Ό κ²μ¦ (μλ§/μ°λ§ λ± μμΈ μν©)
- μ±λ₯ μ€μ μ time λͺ¨λ μ¬μ©
- λ³λ ¬ μ²λ¦¬ μ thread-safe μκ° ν¨μ μ¬μ©