Estou considerando um projeto de análise de dados envolvendo informações sobre transmissões de TV japonesas. Os dados relevantes incluirão horários de transmissão, e alguns deles serão de programas que foram ao ar tarde da noite.
A programação da TV japonesa de fim de noite segue um formato de tempo não padrão chamado sistema de 30 horas (breve explicação em inglês aqui ). A maioria dos horários é dada no horário padrão do Japão, formatado como %H:%M
. Os horários da meia-noite às 6 da manhã, no entanto, são tratados como uma extensão do dia anterior e numerados de acordo, sob a lógica de que é assim que as pessoas que ficam acordadas até tarde os vivenciam. Por exemplo, Macross Frontier foi transmitido em Kansai à 1:25 da manhã, mas foi escrito como 25:25.
Quero usar esses dados em um Pandas ou Polars DataFrame. Teoricamente, eles poderiam ser deixados como uma string, mas seria mais útil convertê-los para um formato padrão para datetimes -- seja o tipo interno do Python ou os tipos usados no NumPy ou Polars. Uma abordagem simples poderia ser:
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'))
Isso poderia então ser aplicado a um DataFrame inteiro com DataFrame.apply()
. Pode haver uma maneira mais performática, no entanto, especialmente considerando os recursos de vetorização de DataFrames -- ambas as bibliotecas recomendam evitar DataFrame.apply()
se houver uma alternativa.
Se bem me lembro, você poderia usar criar uma data e hora com '00:00' como hora e adicionar as horas como
timedelta
:Saída:
A mesma lógica pode ser usada vetorialmente com pandas:
Para se divertir, como uma frase curta:
Saída:
Aqui está uma solução Polars pura, usando a mesma ideia mencionada acima de criar uma data e depois adicionar as horas/minutos do período de 30 horas.
Isso pode ser colocado em uma função para abstração/facilidade de reutilização
Como alternativa , você também pode usar Expr.dt.offset_by e pl.format
... + pl.duration(...)
para obter o mesmo resultado .Se suas strings de hora/minutos estiverem no formato exigido por
dt.offset_by
, as coisas também ficarão um pouco mais simplesPara sua informação, também há um problema aceito para introduzir um analisador de string de duração no Polars, que se/quando concluído provavelmente simplificaria ainda mais esta resposta.