使用pd.to_datetime将“对象”列转换为%HH:MM:SS

时间:2019-02-20 16:36:34

标签: python json pandas beautifulsoup

我正在使用从2018 KONA IRONMAN抓取的完成时间数据进行一些探索性数据分析。我使用JSON格式化数据,并使用熊猫将其读入csv。 'swim','bike','run'列的格式应为%HH:MM:SS,以便可操作,但是,我收到ValueError:(('Unknown string format:','-:-: -')。

let pingTimer = setInterval(ping, 100);
let pingUtilities = new PingUtilities();

function ping() {
  let port = chrome.runtime.connect();
  if (port) {
    pingUtilities.checkTitleInLinkedIn();
    pingUtilities.appendBookMarkInPing();
    pingUtilities.checkCounter();
    port.disconnect();
    return;
  }
  clearInterval(pingTimer);
  pingUtilities.onDisabled();
}
print(data.head(2))
print(kona.info())
print(kona.describe())

我应该如何使用pd.to_datetime正确设置'bike','swim','run'列的格式,并为将来使用而对这些列求和并附加“ Total Finish Time”列?谢谢!

1 个答案:

答案 0 :(得分:0)

错误的原因是因为它无法从'-:-:-'中拉出时间。因此,您需要将所有这些都转换为“ 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()。它将以相同的方式工作,因为您不需要包括--:--:--。但是,您可以总结这些时间。我还添加了一列完成活动的数量,因此,如果您想按最佳时间进行排序,则可以过滤掉所有未参加所有三项比赛的人,因为显然他们会错过更好的比赛,因为他们错过了全部比赛事件:

关于以下内容的评论,我还将添加

  

“您认为提供所有代码将有所帮助,但没有帮助。您   如果您保留代码,将获得更快,更有用的响应   至少可以复制您的问题。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]