我正在考虑一个涉及日本电视广播信息的数据分析项目。相关数据将包括播出时间,其中一些是深夜播出的节目。
日本深夜电视节目表遵循一种非标准时间格式,称为“30 小时制”(简短的英文解释此处)。大多数时间均以正常的日本标准时间给出,格式为 %H:%M
。然而,从午夜到早上 6 点的时间被视为前一天的延长,并进行相应编号,其逻辑是人们熬夜的经历就是这样。例如《超时空要塞Frontier》在关西凌晨1点25分播出,但写的是25点25分。
from datetime import date, time, datetime
from zoneinfo import ZoneInfo
def process_30hour(d: date, t: str):
h, m = [int(n) for n in t.split(':')] # assumes format 'HH:MM' for t
if h > 23:
h -= 24
d += 1
return datetime.combine(d, time(h, m), ZoneInfo('Japan'))
然后可以使用
DataFrame.apply()
将其应用于整个 DataFrame。然而,可能有一种更高效的方法,特别是考虑到 DataFrame 的矢量化特性——如果有替代方案,两个库都建议避免
DataFrame.apply()
。:
from datetime import date, time, datetime, timedelta
from zoneinfo import ZoneInfo
def process_30hour(d: date, t: str):
h, m = map(int, t.split(':')) # assumes format 'HH:MM' for t
t = timedelta(hours=h, minutes=m)
return datetime.combine(d, time(), ZoneInfo('Japan')) + t
process_30hour(date(2024, 12, 20), '25:25')
输出:
datetime.datetime(2024, 12, 21, 1, 25, tzinfo=zoneinfo.ZoneInfo(key='Japan'))
相同的逻辑可以用于 pandas:
df = pd.DataFrame({'date': ['2024-12-20 20:25', '2024-12-20 25:25']})
# split string
tmp = df['date'].str.split(expand=True)
# convert to datetime/timedelta, combine
df['datetime'] = pd.to_datetime(tmp[0]) + pd.to_timedelta(tmp[1]+':00')
输出:
date datetime
0 2024-12-20 20:25 2024-12-20 20:25:00
1 2024-12-20 25:25 2024-12-21 01:25:00