将ISO 8601数据的Pandas列转换为秒

时间:2016-11-04 21:57:30

标签: python pandas duration iso8601 isodate

我尝试将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

我感谢任何帮助。感谢。

3 个答案:

答案 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

注意,这里有一个技巧:将timedeltanp.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]