我正在尝试将ISO8601持续时间数据的pandas dataframe列转换为total seconds。持续时间值看起来像PT7M7S
这意味着7分7秒。如果我使用类似isodate.parse_duration("PT7M7S")
的方法,isodate 0.5.4在解析一个字符串时是有效的。但是,我需要在pandas列上运行相同的命令,不知道如何运行。我尝试了isodate.parse_duration(df2['duration'])
,但它返回了TypeError: Expecting a string
。
以下代码创建测试数据帧:
df = ["PT7M7S", "PT7M14S", "PT6M45S"]
df = pd.DataFrame.from_dict(df)
names = df.columns.tolist()
names[names.index(0)] = 'duration'
df.columns = names
这是我尝试但无效的代码:
import isodate
dur = isodate.parse_duration(df['duration'])
df['duration'] = dur.total_seconds()
理想的输出是让列
duration
包含与该行对应的总秒数。例如,它将读取PT7M7S
而不是第一行。我很感激你的帮助。谢谢。
最佳答案
您可以使用str.extract
来解析字符串:
import numpy as np
import pandas as pd
df = pd.DataFrame({'duration': ["PT7M7S", "PT7M14S", "PT6M45S"]})
df[['minutes','seconds']] = df['duration'].str.extract(r'PT(\d+)M(\d+)S', expand=True).astype('int')
df['total_seconds'] = 60*df['minutes'] + df['seconds']
产量
duration minutes seconds total_seconds
0 PT7M7S 7 7 427
1 PT7M14S 7 14 434
2 PT6M45S 6 45 405