将HH:MM大熊猫中的列转换为分钟

时间:2018-11-01 09:41:06

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

我想将hh:mm格式的数据集中的列转换为分钟。我尝试了以下代码,但它显示“ AttributeError:'Series'对象没有属性'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)

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:1)

我了解到您在DataFrame中有一列带有多个Timedeltas作为字符串。然后,您要提取增量的总分钟数。之后,您要用总分钟数的中位数填充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. 您的Timedeltas不是Timedeltas。它们是字符串。因此,您需要先进行转换。

    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())
    
相关问题