代码之家  ›  专栏  ›  技术社区  ›  Shay Guy

我应该如何解析日语“30小时”格式的时间进行数据分析?

  •  2
  • Shay Guy  · 技术社区  · 5 月前

    我正在考虑一个涉及日本电视广播信息的数据分析项目。相关数据将包括广播时间,其中一些将用于深夜播出的节目。

    日本深夜的电视节目表遵循一种非标准的时间格式,称为 30-hour system (简短的英文解释 here ). 大多数时间以正常的日本标准时间给出,格式为 %H:%M .然而,从午夜到早上6点的时间被视为前一天的延长,并相应地编号,因为这就是人们熬夜的经历。例如,《Macross Frontier》于凌晨1:25在关西播出,但被写成了25:25。

    我想在Pandas或Polars DataFrame中使用这些数据。理论上,它可以保留为字符串,但将其转换为日期时间的标准格式会更有用——无论是Python的内置类型,还是NumPy或Polars中使用的类型。一个简单的方法可以是:

    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 DataFrame.apply() 然而,可能有一种更高性能的方法,特别是考虑到DataFrames的矢量化特性——这两个库都建议避免 DataFrame.apply() 如果有其他选择的话。

    1 回复  |  直到 5 月前
        1
  •  2
  •   mozway    5 月前

    IIUC,您可以使用创建一个以“00:00”为时间的日期时间,并将小时添加为 timedelta :

    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
        return (datetime.combine(d, time(), ZoneInfo('Japan'))
               + timedelta(hours=h, minutes=m))
    
    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')
    

    为了好玩,作为一句俏皮话:

    df['datetime'] = (df['date'].add(':00')
                      .str.split(expand=True)
                      .astype({0: 'datetime64[ns]',
                               1: 'timedelta64[ns]'})
                      .sum(axis=1)
                     )
    

    输出:

                   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