【问题标题】:Using pd.to_datetime to convert "object" column into %HH:MM:SS使用 pd.to_datetime 将“对象”列转换为 %HH:MM:SS
【发布时间】:2019-07-14 10:22:17
【问题描述】:

我正在使用从 2018 年 KONA IRONMAN 中提取的完成时间数据进行一些探索性数据分析。我使用 JSON 格式化数据并使用 pandas 读入 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' 列并为将来使用对这些列求和并附加一个 'Total Finish Time' 列?谢谢!

【问题讨论】:

  • 您认为提供所有代码会有所帮助,但事实并非如此。如果您保持可以复制您的问题的最少代码,您将获得更快、更有用的响应。stackoverflow.com/help/mcve
  • 问题是当格式中没有字符串时它不知道如何解析(需要在“##:##:##”时间有数字。所以你必须如果两件事,则做一件 a) 将所有“-:-:-”更改为“00:00:00”。如果你同意的话。或者 b) 仅解析具有实际时间的字符串并跳过“-:-:-”行。
  • 另外,您确定要将数据写入“data.txt”吗?您正在阅读“data.csv”。

标签: python json pandas beautifulsoup


【解决方案1】:

错误的原因是它无法从“--:--:--”中提取时间。因此,您需要将所有这些转换为“00:00:00”,但这意味着他们在 0 时间内完成了该事件。另一种选择是只转换存在的时间,在没有时间的地方留下空值。当您转换为datetime 时,这还将包括日期1900-01-01。我输入了.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 – 疯了_"

我会给他带来疑问的好处,因为他看到了整个代码,却没有意识到您提供的代码是复制您的问题的最少代码,因为没有人愿意编写一种方法来生成您的数据以供使用.有时您可以在问题中明确说明这一点。

即:

这是生成我的数据的代码:

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]

【讨论】:

  • 非常感谢您的时间和指导chitown88!
  • 不用担心。我喜欢做这些事情,因为它可以帮助我学习、练习,并且有时可以在其他人发布替代解决方案时学习新技巧。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 2021-05-18
  • 2018-07-11
  • 1970-01-01
  • 2015-12-29
  • 2021-07-26
  • 1970-01-01
相关资源
最近更新 更多