我尝试将ISO 8601持续时间数据的pandas数据帧列转换为总秒数。持续时间值看起来像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
行,它将显示为427
。
我感谢任何帮助。感谢。
答案 0 :(得分:3)
您可以使用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
答案 1 :(得分:1)
为什么不在系列df['duration']
上使用In [17]: df['duration'] = df['duration'].apply(isodate.parse_duration)
In [18]: df['duration'] = df['duration']/np.timedelta64(1, 's')
In [19]: df
duration
0 427.0
1 434.0
2 405.0
功能,这会更快。
这是一个代码示例。
datetime
注意,这里有一个技巧:将timedelta
或np.timedelta64
对象除以NaN
不同的单位,你可以获得该对象的单位数。
顺便说一句,如果您有unutbu
或缺少值,则需要处理它们。
另一个提及,对于'M'
的回答,它仅适用于您的数据仅包含'S'
和PnnYnnMnnDTnnHnnMnnS
的情况。因为duration_isoformat
可能是{{1}}。
希望这对你有用。
答案 2 :(得分:0)
这是另一种解决方案:
In [53]: (pd.to_datetime(df['duration'], format='PT%MM%SS', errors='coerce') -
...: pd.to_datetime('1900-01-01')).dt.total_seconds()
...:
Out[53]:
0 427.0
1 434.0
2 405.0
Name: duration, dtype: float64
数据:
In [54]: df
Out[54]:
duration
0 PT7M7S
1 PT7M14S
2 PT6M45S
说明:
In [55]: pd.to_datetime(df['duration'], format='PT%MM%SS', errors='coerce')
Out[55]:
0 1900-01-01 00:07:07
1 1900-01-01 00:07:14
2 1900-01-01 00:06:45
Name: duration, dtype: datetime64[ns]