Python datetime - столбец с двумя форматами даты (H: M: S), когда время> 1 часа, и (M: S), когда время <1 часа - как анализировать - PullRequest
3 голосов
/ 05 июля 2019

Я собрал набор данных о времени выполнения финиша, который включает бегунов, заканчивающих за час и выше часа. Бегуны в течение часа кодируются как M: S, например 48:12 для бегуна, который финишировал за 48 минут и 12 секунд. Бегуны выше часа кодируются как H: M: S, например 1: 12: 45.

Есть ли способ передать два формата в datetime и кодировать их все как H: M: S?

Я пытался:

df['Time'] = pd.to_datetime(df['Time'],format="%H:%M:%S")

это (правильно) выдает ошибку для бегунов в течение часа.

for obs in range(1,len(df)):
    text = df.iloc[obs].loc['Time']
    for fmt in ('%M:%S', '%H:%M:%S'):
        try:
            datetime.strptime(text, fmt)
        except ValueError:
            pass
    raise ValueError('no valid date format found') 

Это дает оценщику ошибку, что не был найден правильный формат.

Я хочу, чтобы решение было чем-то, что я мог бы использовать для разных наборов данных, поэтому просто найти первого участника в течение часа и использовать другой формат с тех пор не получится.

Ответы [ 2 ]

0 голосов
/ 05 июля 2019

Используйте pd.to_timedelta (или pd.to_datetime), но сначала убедитесь, что время указано в формате «ЧЧ: ММ: СС», добавив его соответствующим образом.

import pandas as pd
import numpy as np
df = pd.DataFrame({'Time': ['1', '8:12', '48:11', '1:12:13', '123:12:12']})

fill = '00:00:00'
s = df.Time.str.len()

pd.to_timedelta([fill[0:x] for x in np.clip(len(fill)-s, a_min=0, a_max=None)] + df.Time)

выход

0   0 days 00:00:01
1   0 days 00:08:12
2   0 days 00:48:11
3   0 days 01:12:13
4   5 days 03:12:12
Name: Time, dtype: timedelta64[ns]
0 голосов
/ 05 июля 2019

Попробуйте:

df = pd.DataFrame({'Time': ['1:01:02', '3:20', 'xyz']})

tmp = (df.Time
         .str.extract('(\d*):?(\d+):(\d+)$')
         .replace('',0).astype(float)
      )

, что дает вам

     0    1     2
0  1.0  1.0   2.0
1  0.0  3.0  20.0
2  NaN  NaN   NaN

, и вы можете получить общее количество секунд:

tmp[0] * 3600 + tmp[1] * 60 + tmp[2]

, из которого выможно преобразовать в timedelta тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...