【问题标题】:Convert a column in pandas of HH:MM to minutes将 HH:MM 的 pandas 中的一列转换为分钟
【发布时间】:2019-04-05 12:30:06
【问题描述】:

我想将数据集中 hh:mm 格式的列转换为分钟。我尝试了以下代码,但它显示“AttributeError: 'Series' object has no attribute 'split'”。数据格式如下。我在数据集中也有 nan 值,计划是计算值的中值,然后用中值填充具有 nan 的行

02:32
02:14
02:31
02:15
02:28
02:15
02:22
02:16
02:22
02:14

到目前为止我已经尝试过了

 s = dataset['Enroute_time_(hh mm)']

   hours, minutes = s.split(':')
   int(hours) * 60 + int(minutes)

【问题讨论】:

    标签: python string python-3.x pandas timedelta


    【解决方案1】:

    如果您想使用split,则需要使用str 访问器,即s.str.split(':')。

    但是我认为在这种情况下使用apply 更有意义:

    df = pd.DataFrame({'Enroute_time_(hh mm)': ['02:32', '02:14', '02:31', 
                                                '02:15', '02:28', '02:15', 
                                                '02:22', '02:16', '02:22', '02:14']})
    
    def convert_to_minutes(value):
        hours, minutes = value.split(':')
        return int(hours) * 60 + int(minutes)
    
    df['Enroute_time_(hh mm)'] = df['Enroute_time_(hh mm)'].apply(convert_to_minutes)
    print(df)
    
    #       Enroute_time_(hh mm)
    #    0                   152
    #    1                   134
    #    2                   151
    #    3                   135
    #    4                   148
    #    5                   135
    #    6                   142
    #    7                   136
    #    8                   142
    #    9                   134
    

    【讨论】:

    • 我试过你的答案,它说“AttributeError: 'float' object has no attribute 'split'”
    • @prateeksingh 这意味着您的列中有一些浮点值,可能是NaN?
    • 所有值的格式相同。但它确实有一些 nan 值。我的计划是将其转换为分钟,然后用其余值的中位数填充 nan 值。
    【解决方案2】:

    我建议您避免按行计算。您可以对 Pandas / NumPy 使用矢量化方法:

    df = pd.DataFrame({'time': ['02:32', '02:14', '02:31', '02:15', '02:28', '02:15', 
                                '02:22', '02:16', '02:22', '02:14', np.nan]})
    
    values = df['time'].fillna('00:00').str.split(':', expand=True).astype(int)
    factors = np.array([60, 1])
    
    df['mins'] = (values * factors).sum(1)
    
    print(df)
    
         time  mins
    0   02:32   152
    1   02:14   134
    2   02:31   151
    3   02:15   135
    4   02:28   148
    5   02:15   135
    6   02:22   142
    7   02:16   136
    8   02:22   142
    9   02:14   134
    10    NaN     0
    

    【讨论】:

    • 我在数据集中也有 nan 值。我的计划是使用当前值的中值,然后用中值填充那些 nan 行。您的方法是正确的,但无法处理 nan 值。我该怎么办?
    【解决方案3】:

    我了解到您在 DataFrame 中有一个列,其中包含多个 Timedelta 作为字符串。然后你想提取增量的总分钟数。之后,您想用总分钟数的中位数填充 NaN 值。

    import pandas as pd
    df = pd.DataFrame(
         {'hhmm' : ['02:32',
                    '02:14',
                    '02:31',
                    '02:15',
                    '02:28',
                    '02:15',
                    '02:22',
                    '02:16',
                    '02:22',
                    '02:14']})
    
    1. 您的时间增量不是时间增量。它们是字符串。所以你需要先转换它们。

      df.hhmm = pd.to_datetime(df.hhmm, format='%H:%M')
      df.hhmm = pd.to_timedelta(df.hhmm - pd.datetime(1900, 1, 1))
      

      这会为您提供以下值(请注意此处的 dtype:timedelta64[ns])

      0   02:32:00
      1   02:14:00
      2   02:31:00
      3   02:15:00
      4   02:28:00
      5   02:15:00
      6   02:22:00
      7   02:16:00
      8   02:22:00
      9   02:14:00
      Name: hhmm, dtype: timedelta64[ns]
      
    2. 现在您有了真正的时间增量,您可以使用一些很酷的函数,例如total_seconds(),然后计算分钟。

      df.hhmm.dt.total_seconds() / 60
      
    3. 如果这不是你想要的,你也可以使用下面的。

      df.hhmm.dt.components.minutes
      

      这为您提供了 HH:MM 字符串中的分钟数,就像您将其拆分一样。

    4. 填写 na 值。

       df.hhmm.fillna((df.hhmm.dt.total_seconds() / 60).mean())
      

      或

      df.hhmm.fillna(df.hhmm.dt.components.minutes.mean())
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-18
      • 2021-08-08
      相关资源
      最近更新 更多