Использование pd.to_datetime для преобразования столбца «object» в% HH: MM: SS - PullRequest
0 голосов
/ 20 февраля 2019

Я выполняю некоторый предварительный анализ данных с использованием данных о времени окончания, полученных с KONA IRONMAN в 2018 году.Я использовал JSON для форматирования данных и панд для чтения в CSV.Столбцы 'swim', 'bike', 'run' должны быть отформатированы как% HH: MM: SS, чтобы их можно было использовать, однако я получаю ValueError: ('Unknown string format:', '-: -::- ').

print(data.head(2))
print(kona.info())
print(kona.describe())
     Name div_rank    ...         bike       run
0    Avila, Anthony 2470      138    ...     05:27:59  04:31:56
1  Lindgren, Mikael 1050      151    ...     05:17:51  03:49:20

     swim            2472 non-null object
     bike            2472 non-null object
     run             2472 non-null object

     Name div_rank    ...         bike       run
     count                2472     2472    ...         2472      2472
     unique               2472      288    ...         2030      2051
     top     Jara, Vicente 986       --    ...     --:--:--  --:--:--
     freq                    1      165    ...          122       165

Как использовать pd.to_datetime для правильного форматирования столбцов' bike ',' swim ',' run 'и для будущего использованиясуммировать эти столбцы и добавить столбец «Общее время окончания»?Спасибо!

1 Ответ

0 голосов
/ 21 февраля 2019

Причина ошибки в том, что она не может извлечь время из '-: -: -'.Таким образом, вам нужно преобразовать все это в «00: 00: 00», но это означает, что они сделали событие в 0 раз.Другой вариант - просто преобразовать имеющееся время, оставив нулевое значение в местах, где нет времени.Это также будет включать дату 1900-01-01, когда вы конвертируете в datetime.Я поставил .dt.time, чтобы отображалось только время.

timed_events = ['bike', 'swim', 'run']
for event in timed_events:
    result[event] = pd.to_datetime(result[result[event] != '--:--:--'][event], format="%H:%M:%S").dt.time

Проблема в том, что я помню, что вы хотели суммировать эти времена, что потребовало бы от вас дополнительных преобразований.Поэтому я предлагаю использовать .to_timedelta() вместо.Это будет работать так же, как вам не нужно включать --:--:--.Но тогда вы можете суммировать эти времена.Я также добавил столбец с числом завершенных событий, так что если вы хотите отсортировать по лучшим временам, вы можете отфильтровать любого, кто не участвовал в соревнованиях по всем трем событиям, так как очевидно, что у них будут лучшие времена, потому что они пропускают всеevents:

Я также добавлю, относительно комментария:

"Вы думаете, что предоставление всего кода будет полезным, но это не так. Вы получите быстрее и большеполезный ответ, если вы сохраните минимум кода, который может повторить вашу проблему .stackoverflow.com/help/mcve - mad_ "

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

т.е.:

Вот код для генерации моих данных:

CODE PART 1

import bs4
import pandas as pd

code...

Но теперь, когда у меня есть данные, вот гдеУ меня возникли проблемы:

df = pd.to_timedelta()...
...

К счастью, я помнил, как раньше помогал вам в этом, поэтому знал, что могу вернуться и получить этот код.Итак, код, который у вас изначально был, был в порядке.

Но вот полный код, который я использовал, и это другой способ хранения CSV, чем вы изначально имели.Таким образом, вы можете изменить эту часть, но вам нужна конечная часть:

from bs4 import BeautifulSoup, Comment
from collections import defaultdict
import requests
import pandas as pd

sauce = 'http://m.ironman.com/triathlon/events/americas/ironman/world-championship/results.aspx'

r = requests.get(sauce)
data = r.text
soup = BeautifulSoup(data, 'html.parser')

def parse_table(soup):
    result = defaultdict(list)
    my_table = soup.find('tbody')

    for node in my_table.children:
        if isinstance(node, Comment):
            # Get content and strip comment "<!--" and "-->"
            # Wrap the rows in "table" tags as well.
            data = '<table>{}</table>'.format(node[4:-3])
            break

    table = BeautifulSoup(data, 'html.parser')

    for row in table.find_all('tr'):
        name, _, swim, bike, run, div_rank, gender_rank, overall_rank = [col.text.strip() for col in row.find_all('td')[1:]]

        result[name].append({
            'div_rank': div_rank,
            'gender_rank': gender_rank,
            'overall_rank': overall_rank,
            'swim': swim,
            'bike': bike,
            'run': run,
        })

    return result

jsonObj = parse_table(soup)

result = pd.DataFrame()
for k, v in jsonObj.items():

    temp_df = pd.DataFrame.from_dict(v)
    temp_df['name'] = k
    result = result.append(temp_df)

result = result.reset_index(drop=True)
result.to_csv('C:/data.csv', index=False)

# However you read in your csv/dataframe, use the code below on it to get those times
timed_events = ['bike', 'swim', 'run']
for event in timed_events:
    result[event] = pd.to_timedelta(result[result[event] != '--:--:--'][event])

result['total_events_participated'] = 3 - result.isnull().sum(axis=1)
result['total_times'] = result[timed_events].sum(axis=1)

Вывод:

print (result)
         bike div_rank     ...     total_events_participated total_times
0    05:27:59      138     ...                             3    11:20:06
1    05:17:51      151     ...                             3    10:16:17
2    06:14:45      229     ...                             3    14:48:28
3    05:13:56      162     ...                             3    10:19:03
4    05:19:10        6     ...                             3    09:51:48
5    04:32:26       25     ...                             3    08:23:26
6    04:49:08      155     ...                             3    10:16:16
7    04:50:10      216     ...                             3    10:55:47
8    06:45:57       71     ...                             3    13:50:28
9    05:24:33      178     ...                             3    10:21:35
10   06:36:36       17     ...                             3    14:36:59
11        NaT       --     ...                             0    00:00:00
12   04:55:29      100     ...                             3    09:28:53
13   05:39:18       72     ...                             3    11:44:40
14   04:40:41       --     ...                             2    05:35:18
15   05:23:18       45     ...                             3    10:55:27
16   05:15:10        3     ...                             3    10:28:37
17   06:15:59       78     ...                             3    11:47:24
18        NaT       --     ...                             0    00:00:00
19   07:11:19       69     ...                             3    15:39:51
20   05:49:02       29     ...                             3    10:32:36
21   06:45:48        4     ...                             3    13:39:17
22   04:39:46       --     ...                             2    05:48:38
23   06:03:01        3     ...                             3    11:57:42
24   06:24:58      193     ...                             3    13:52:57
25   05:07:42      116     ...                             3    10:01:24
26   04:44:46      112     ...                             3    09:29:22
27   04:46:06       55     ...                             3    09:32:43
28   04:41:05       69     ...                             3    09:31:32
29   05:27:55       68     ...                             3    11:09:37
      ...      ...     ...                           ...         ...
2442      NaT       --     ...                             0    00:00:00
2443 05:26:40        3     ...                             3    11:28:53
2444 05:04:37       19     ...                             3    10:27:13
2445 04:50:45       74     ...                             3    09:15:14
2446 07:17:40      120     ...                             3    14:46:05
2447 05:26:32       45     ...                             3    10:50:48
2448 05:11:26      186     ...                             3    10:26:00
2449 06:54:15      185     ...                             3    14:05:16
2450 05:12:10       22     ...                             3    11:21:37
2451 04:59:44       45     ...                             3    09:29:43
2452 06:03:59       96     ...                             3    12:12:35
2453 06:07:27       16     ...                             3    12:47:11
2454 04:38:06       91     ...                             3    09:52:27
2455 04:41:56       14     ...                             3    08:58:46
2456 04:38:48       85     ...                             3    09:18:31
2457 04:42:30       42     ...                             3    09:07:29
2458 04:40:54      110     ...                             3    09:32:34
2459 06:08:59       37     ...                             3    12:15:23
2460 04:32:20       --     ...                             2    05:31:05
2461 04:45:03       96     ...                             3    09:30:06
2462 06:14:29       95     ...                             3    13:38:54
2463 06:00:20      164     ...                             3    12:10:03
2464 05:11:07       22     ...                             3    10:32:35
2465 05:56:06      188     ...                             3    13:32:48
2466 05:09:26        2     ...                             3    09:54:55
2467 05:22:15        7     ...                             3    10:26:14
2468 05:53:14      254     ...                             3    12:34:21
2469 05:00:29      156     ...                             3    10:18:29
2470 04:30:46        7     ...                             3    08:38:23
2471 04:34:59       39     ...                             3    09:04:13

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