Перевести колонки в панды ЧЧ: ММ в минуты - PullRequest
0 голосов
/ 01 ноября 2018

Я хочу преобразовать столбец в наборе данных формата чч: мм в минуты. Я попробовал следующий код, но он говорит: «AttributeError: объект« Series »не имеет атрибута« split »». Данные в следующем формате. У меня также есть значения nan в наборе данных, и план состоит в том, чтобы вычислить медиану значений и затем заполнить строки, в которых есть nan, медианой

02:32
02:14
02:31
02:15
02:28
02:15
02:22
02:16
02:22
02:14

Я пробовал это до сих пор

 s = dataset['Enroute_time_(hh mm)']

   hours, minutes = s.split(':')
   int(hours) * 60 + int(minutes)

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Я предлагаю вам избегать построчных вычислений. Вы можете использовать векторизованный подход с Pandas / NumPy:

df = pd.DataFrame({'time': ['02:32', '02:14', '02:31', '02:15', '02:28', '02:15', 
                            '02:22', '02:16', '02:22', '02:14', np.nan]})

values = df['time'].fillna('00:00').str.split(':', expand=True).astype(int)
factors = np.array([60, 1])

df['mins'] = (values * factors).sum(1)

print(df)

     time  mins
0   02:32   152
1   02:14   134
2   02:31   151
3   02:15   135
4   02:28   148
5   02:15   135
6   02:22   142
7   02:16   136
8   02:22   142
9   02:14   134
10    NaN     0
0 голосов
/ 01 ноября 2018

Я понял, что у вас есть столбец в DataFrame с несколькими Timedeltas как Strings. Затем вы хотите извлечь общее количество минут Deltas. После этого вы хотите заполнить значения NaN медианой общего количества минут.

import pandas as pd
df = pd.DataFrame(
     {'hhmm' : ['02:32',
                '02:14',
                '02:31',
                '02:15',
                '02:28',
                '02:15',
                '02:22',
                '02:16',
                '02:22',
                '02:14']})
  1. Ваши Timedeltas не являются Timedeltas. Это струны. Поэтому вам нужно сначала преобразовать их.

    df.hhmm = pd.to_datetime(df.hhmm, format='%H:%M')
    df.hhmm = pd.to_timedelta(df.hhmm - pd.datetime(1900, 1, 1))
    

    Это дает вам следующие значения ( Обратите внимание на dtype: timedelta64 [ns] здесь )

    0   02:32:00
    1   02:14:00
    2   02:31:00
    3   02:15:00
    4   02:28:00
    5   02:15:00
    6   02:22:00
    7   02:16:00
    8   02:22:00
    9   02:14:00
    Name: hhmm, dtype: timedelta64[ns]
    
  2. Теперь, когда у вас есть истинные таймдельты, вы можете использовать некоторые классные функции, такие как total_seconds(), а затем вычислить минуты.

    df.hhmm.dt.total_seconds() / 60
    
  3. Если это не то, что вы хотели, вы также можете использовать следующее.

    df.hhmm.dt.components.minutes
    

    Это дает вам минуты из строки ЧЧ: ММ, как если бы вы разбили ее.

  4. Заполните значения na.

     df.hhmm.fillna((df.hhmm.dt.total_seconds() / 60).mean())
    

    или

    df.hhmm.fillna(df.hhmm.dt.components.minutes.mean())
    
0 голосов
/ 01 ноября 2018

Если вы хотите использовать split, вам нужно будет использовать аксессор str, то есть s.str.split(':').

Однако я думаю, что в этом случае имеет больше смысла использовать apply:

df = pd.DataFrame({'Enroute_time_(hh mm)': ['02:32', '02:14', '02:31', 
                                            '02:15', '02:28', '02:15', 
                                            '02:22', '02:16', '02:22', '02:14']})

def convert_to_minutes(value):
    hours, minutes = value.split(':')
    return int(hours) * 60 + int(minutes)

df['Enroute_time_(hh mm)'] = df['Enroute_time_(hh mm)'].apply(convert_to_minutes)
print(df)

#       Enroute_time_(hh mm)
#    0                   152
#    1                   134
#    2                   151
#    3                   135
#    4                   148
#    5                   135
#    6                   142
#    7                   136
#    8                   142
#    9                   134
...