当前位置: 首页 > 知识库问答 >
问题:

在熊猫中,我如何使用正则表达式将人类可读的时间格式分解为不同的单位,如天,小时,分钟和秒?

公冶谦
2023-03-14

在dataframe上,我有一列人类可读格式的持续时间,如“29天4小时32分钟1秒”。我想将它们分解为天、小时、分钟和秒列,这些列的值来自持续时间列。比如29天,4小时,32分钟,1秒。我已经使用过这个,但它不能正常工作:

# Use regex to extract time values into their respective columns
new_df = df['duration'].str.extract(r'(?P<days>\d+(?= day))|(?P<hours>\d+(?= hour))|(?P<minutes>\d+(?= min))|(?P<seconds>\d+(?= sec))')

例如,

import pandas as pd
import re

list = {'id': ['123','124','125','126','127'],
        'date': ['1/1/2018', '1/2/2018', '1/3/2018', '1/4/2018','1/5/2018'],
        'duration': ['29 days 4 hours 32 minutes',
                     '1 hour 23 minutes',
                     '3 hours 2 minutes 1 second',
                     '4 hours 46 minutes 22 seconds',
                     '2 hours 1 minute']}

df = pd.DataFrame(list)

# Use regex to extract time values into their respective columns
new_df = df['duration'].str.extract(r'(?P<days>\d+(?= day))|(?P<hours>\d+(?= hour))|(?P<minutes>\d+(?= min))|(?P<seconds>\d+(?= sec))')

以下数据帧中的结果:

新的dataframe只包含第一个值,而不包含其余的值。它捕获了29天的值,以及1、3、4、2分钟的值,但随后的列值是NAN。

理想情况下,数据帧应如下所示:

我感觉我的正则表达式有问题。我不应该使用“|”来分隔组吗?任何正确方向的帮助或推动都是值得感激的。

共有2个答案

司寇飞航
2023-03-14

这是我使用提取而不是提取的方法:

# same pattern as yours
# can replace this with a for loop
pattern = ( '(?P<days>\d+)(?= days?\s*)|'        # days
          + '(?P<hours>\d+)(?= hours?\s*)|'      # hours
          + '(?P<minutes>\d+)(?= minutes?\s*)|'  # minutes
          + '(?P<seconds>\d+)(?= seconds?\s*)'   # seconds
          )

(df.duration.str.extractall(pattern)   # extract all with regex
  .reset_index('match',drop=True)      # merge the matches of the same row
  .stack()
  .unstack(level=-1, fill_value=0)     # remove fill_value if you want NaN instead of 0
)

输出:

  days hours minutes seconds
0   29     4      32       0
1    0    12      23       0
2    0     3       2       1
3    0     4      46      22
4    0     2       1       0
魏君博
2023-03-14

您的字符串格式与 pd 匹配。时间详图字符串规范。只需将其直接转换为Timedelta并调用其属性组件即可

df_final = (df.duration.map(pd.Timedelta)
              .dt.components[['days','hours','minutes','seconds']])

或者

df_final = (pd.to_timedelta(df.duration)
              .dt.components[['days','hours','minutes','seconds']])

Out[258]:
   days  hours  minutes  seconds
0    29      4       32        0
1     0      1       23        0
2     0      3        2        1
3     0      4       46       22
4     0      2        1        0
 类似资料:
  • 问题内容: 我的pandas df包含一个包含逗号分隔特征的列,如下所示: 我想将此列拆分为多个虚拟变量列,但无法弄清楚如何启动此过程。我正在尝试像这样拆分列: 但是,这不起作用,因为描述中间有逗号。取而代之的是,我需要根据逗号的正则表达式匹配,后跟一个空格和一个大写字母进行拆分。str.split可以使用正则表达式吗?如果是这样,这是怎么做的? 我认为正则表达式可以满足我的需求: 问题答案: 是

  • 有几个问题,但没有回答我的问题。我希望使用pattern和matcher在字符串中找到一个模式,然后从那里创建一个匹配列表,其中包括不匹配的其余部分。 我目前的结果: 假的 我的预期结果应该在列表中: ["125t","160f"]//我知道如何在python中做到这一点,但不知道如何在java中做到这一点。所以有人能帮我吗?

  • 我的函数返回时间,例如。如何将时间取整到最接近的一分钟,使变为并使变为。

  • 我有datetime格式的值。例如:2012-10-17 00:05:00.000我把它们铸成了时间格式,但对我来说还是太长了。我只想要一个小时一个分钟的时间。有人知道吗?

  • 我需要帮助/建议添加到一段php代码管理一个“time ago”-函数的功能。基本上,它将发布日期与当前时间进行比较。在使用英语时,这一切都很好,因为所有复数(秒、分钟、小时、天、年)都以字母结尾。 然而,在我的母语中,情况并非如此。所以我需要关于如何设置不同的结束取决于什么金额已经过去的建议。

  • 这里有dataset和DateTime。在这里,我想在我的csv文件中逐行获得不同的时间值。 所以我写了代码,以分钟为单位得到时间不同的值。然后我想换算时间以小时为单位。 那意味着; 但当我尝试它时,它与我所需的格式不匹配。我只是把时差除以60。 我的代码: 打印(DF1['time_diff']) 然后结果: 除以60后: 结果: 但必须将30分钟转换为0.5小时。 预期产出: [![ 有人能帮