Как мне представить время в виде целого числа в pandas DataFrame? - PullRequest
0 голосов
/ 12 января 2020

У меня есть DataFrame, считанный из CSV, как таковой (времена как ЧЧ: ММ: СС):

    pta         ptd         tpl_num
4   05:17       05:18       0
6   05:29:30    05:30       1
9   05:42       05:44:30    2
11  05:53       05:54       3
12  06:03       06:05:30    4
17  06:24:30    NaN         5

dtypes:

pta                object
ptd                object
tpl_num             int64

I ' Я пытаюсь получить столбцы pta и ptd как int в формате:

    pta      ptd      tpl_num
4   51700    51800    0
6   52930    53000    1
9   54200    54430    2
11  55300    55400    3
12  60300    60530    4
17  62430    NaN      5

Кажется довольно простым - завершающие нули pad и преобразовать в int. Но я не могу найти способ сделать это. Я преобразовал в строку, добавил нули, удалил двоеточия, но это не позволило мне преобразовать в int из-за неопознанных ячеек NaN. Я не могу конвертировать в datetime, не имея :SS во всех клетках. Не уверен, что делать.

Ответы [ 3 ]

1 голос
/ 12 января 2020

IIU C, вы можете использовать;

final = df.assign(**pd.to_datetime(df[['pta','ptd']].stack()).dt.time.astype(str)
      .str.replace(':','').astype(int).unstack())

        pta      ptd  tpl_num
4   51700.0  51800.0        0
6   52930.0  53000.0        1
9   54200.0  54430.0        2
11  55300.0  55400.0        3
12  60300.0  60530.0        4
17  62430.0      NaN        5
0 голосов
/ 12 января 2020

Вот корректировка, которая преобразуется в десятичные минуты, которые должны соответствовать обучению:

import pandas as pd
import numpy as np
from datetime import datetime

col = pd.Series(['5:17', '05:30', np.NaN, '12:30:10'])

def to_minutes(t):
    if pd.isna(t):
        return t
    if t.count(':')==2:
        t = [int(s) for s in t.split(':')]
        return 60*t[0] + t[1] + 1.0/60*t[2]
    if t.count(':')==1:
        t = [int(s) for s in t.split(':')]
        return 60*t[0] + t[1] 


col_converted = [to_minutes(t) for t in col]

print(col_converted)

Вывод:

[317, 330, nan, 750.1666666666666]

Что касается вашего комментария, который вы просто хотите преобразовать в целое число для scikit.learn, вы ДОЛЖНЫ конвертировать в общий набор единиц. Вы не можете просто бросить вместе преобразованные целые числа. Если вы это сделаете, вы изменили переменную непрерывный на переменную ordinal , потому что вы разрушили линейность. Если вы не хотите, чтобы переменная ordinal не делала этого. Например, если мы посмотрим на 10-минутные приращения через часовую границу, вы получите что-то вроде этого:

from matplotlib import pyplot as plt

col = pd.Series(['5:00', '05:10', '5:20', '5:30', '5:40', '5:50', '6:00', '6:10', '6:20', 
    '6:30', '6:40', '6:50'])

def to_minutes(t):
    if pd.isna(t):
        return t
    if t.count(':')==2:
        t = [int(s) for s in t.split(':')]
        return 60*t[0] + t[1] + 1.0/60*t[2]
    if t.count(':')==1:
        t = [int(s) for s in t.split(':')]
        return 60*t[0] + t[1] 

def to_int(t):
    return int(t.replace(':',''))



true_mins = [to_minutes(t) for t in col]

skewed_time = [to_int(t) for t in col]
print(true_mins)
print(skewed_time)


plt.plot(true_mins, skewed_time)
plt.xlabel('actual minutes')
plt.ylabel('bogus time')
plt.show()

bogus time vs. actual time

0 голосов
/ 12 января 2020

Я предполагаю, что вы хотите в конечном итоге добраться до datetime объектов.

Вы можете создать вспомогательную функцию для преобразования необработанных строк, например:

import pandas as pd
import numpy as np
from datetime import datetime

col = pd.Series(['5:17', '05:30', np.NaN, '12:30:10'])

def date_converter(t):
    if pd.isna(t):
        return t
    if t.count(':')==2:
        return datetime.strptime(t, '%H:%M:%S')
    if t.count(':')==1:
        return datetime.strptime(t, '%H:%M')
    else:
        return None

col_converted = [date_converter(t) for t in col]

print(col_converted)

Вывод:

[datetime.datetime(1900, 1, 1, 5, 17), datetime.datetime(1900, 1, 1, 5, 30), nan, datetime.datetime(1900, 1, 1, 12, 30, 10)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...