将所有 "HH:MM:SS" 转换为秒并将无效字符串转换为 NaT 的最有效方法是什么?

What is the most efficient way of converting all "HH:MM:SS" to seconds and invalid strings to NaT?

我有一个 DataFrame 将马拉松分段(5K、10K 等)和标识符(年龄、性别、国家/地区)存储为列,将个人存储为行。马拉松赛段拆分列的每个单元格可能包含“HH:MM:SS”格式的字符串或“-”(表示该个人的马拉松赛段拆分数据无效或不存在)。

将所有“-”转换为 NaT 并将“HH:MM:SS”转换为秒的最有效方法是什么?

这是一些示例数据:

      Age M/F Country       5K  ...      15K      20K     Half Official Time
2323   38   M     CHI  0:21:40  ...  1:03:54  1:25:07  1:29:43       2:58:47
2324   23   M     USA  0:21:26  ...  1:02:09  1:22:17  1:26:34       2:58:47
2325   36   M     USA  0:21:08  ...  1:02:55  1:23:56  1:28:30       2:58:47
2326   37   M     POL  0:20:34  ...  1:02:03  1:22:52  1:27:24       2:58:47
2327   32   M     DEN        -  ...  1:03:02  1:24:06  1:28:39       2:58:48

我已经引用了 但我的数据已经从 CSV 文件中读取(我不想更改我在 CSV 文件中的读取方式)并且似乎无法接受“- ”。使用以下代码转换为 DateTime 对象:

df.loc[:, "5K":] = df.loc[:, "5K":].apply(pd.to_datetime, format="%H:%M:%S", errors="coerce")

使马拉松赛段拆分列的每个单元格都带有前缀“1900-01-01”。

如果您要测量运行时间,更合适的转换函数可能是 pd.to_timedelta:

df.loc[:, "5K":].apply(pd.to_timedelta, unit='S', errors='coerce'))

这里要记住两点:

对于持续时间,而不是时间轴上的点,pd.to_timedelta 在概念上比 pd.to_datetime 更合适。