【问题标题】:convert string as 'hours' and 'mins' into minutes将字符串作为“小时”和“分钟”转换为分钟
【发布时间】:2021-12-10 08:16:45
【问题描述】:

我的数据框 df 中有一个列:

Time
2 hours 3 mins
5 hours 10 mins
1 hours 40 mins
10 mins
4 hours
6 hours 0 mins

我想在 df 'Minutes' 中创建一个新列,将该列转换为分钟

Minutes
123
310
100
10
240
360

是否有 python 函数可以做到这一点? 我试过的是:

df['Minutes'] = pd.eval(
    df['Time'].replace(['hours?', 'mins'], ['*60+', ''], regex=True))

【问题讨论】:

    标签: python-3.x pandas dataframe


    【解决方案1】:

    这是一个丑陋的错误pd.eval 处理的行数少于 100 行,因此在剥离 + 后在 pd.eval 中调用 pd.eval 以防止它:

    df['Minutes'] = (df['Time'].replace(['hours?', 'mins'], ['*60+', ''], regex=True)
                               .str.strip('+')
                               .apply(pd.eval))
    
    print (df)
                  Time  Minutes
    0   2 hours 3 mins      123
    1  5 hours 10 mins      310
    2  1 hours 40 mins      100
    3          10 mins       10
    4          4 hours      240
    5   6 hours 0 mins      360
    

    #verify for 120 rows
    df = pd.concat([df] * 20, ignore_index=True)
    
    
    df['Minutes1'] = pd.eval(
        df['Time'].replace(['hours?', 'mins'], ['*60+', ''], regex=True).str.strip('+'))
    
    print (df)
    

    ValueError: 未知类型对象

    Series.str.extractSeries.add 的另一种解决方案:

    h = df['Time'].str.extract('(\d+)\s+hours').astype(float).mul(60)
    m = df['Time'].str.extract('(\d+)\s+mins').astype(float)
    
    df['Minutes']  = h.add(m, fill_value=0).astype(int)
    print (df)
                  Time  Minutes
    0   2 hours 3 mins      123
    1  5 hours 10 mins      310
    2  1 hours 40 mins      100
    3          10 mins       10
    4          4 hours      240
    5   6 hours 0 mins      360
    

    【讨论】:

      【解决方案2】:

      jezrael 的回答非常好,但我花了很多时间来解决这个问题,所以我想我会发布它。

      您可以使用regex 从列中捕获“小时”和“分钟”,然后在应用逻辑数学运算转换为分钟后分配回新列:

      r = "(?:(\d+) hours ?)?(?:(\d+) mins)?"
      hours = df.Time.str.extract(r)[0].astype(float).fillna(0) * 60
      minutes = df.Time.str.extract(r)[1].astype(float).fillna(0)
      

      df['minutes'] = hours + minutes
      
      print(df)
      
                    Time  minutes
      0   2 hours 3 mins    123.0
      1  5 hours 10 mins    310.0
      2  1 hours 40 mins    100.0
      3          10 mins     10.0
      4          4 hours    240.0
      5   6 hours 0 mins    360.0
      

      我喜欢使用https://regexr.com/ 来测试我的regex

      【讨论】:

        猜你喜欢
        • 2020-01-28
        • 1970-01-01
        • 2015-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-18
        • 1970-01-01
        • 2019-02-22
        相关资源
        最近更新 更多