将ISO8601数据的Pandas列转换为秒

2024-10-01 00:31:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将ISO8601持续时间数据的pandas dataframe列转换为总秒数。持续时间值看起来像PT7M7S,这意味着7分7秒。如果使用isodate.parse_duration("PT7M7S")之类的东西,isodate0.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

这是我尝试过但无效的代码:

^{pr2}$

理想的输出是使duration列包含与该行相对应的总秒数。例如,第一行不是PT7M7S,而是427。在

谢谢你的帮助。谢谢。在


Tags: columns数据字符串代码dataframepandasdfnames
3条回答

为什么不在序列df['duration']上使用apply函数,这样会快得多。在

这是一个代码示例。在

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

注意,这里有一个诀窍:将datetimetimedelta对象除以np.timedelta64不同的单位,你就可以得到这个对象的单位数。在

顺便说一下,如果有NaN或缺少值,则需要处理它们。在

另外一点,对于来自unutbu的回答,只有当您的数据只包含'M'和{}时,它才是合适的。因为^{}可以是PnnYnnMnnDTnnHnnMnnS。在

希望这对你有用。在

以下是另一种解决方案:

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

数据:

^{pr2}$

说明:

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]

可以使用^{}解析字符串:

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']

收益率

^{pr2}$

相关问题 更多 >