【问题标题】:Pandas Python - convert HH:MM:SS into seconds in aggegate (csv file)Pandas Python - 将 HH:MM:SS 转换为总秒数(csv 文件)
【发布时间】:2015-05-04 22:21:55
【问题描述】:

我正在尝试转换 'Avg.会话持续时间'(HH:MM:SS) 列转换为 Pandas read_csv 模块/函数中的整数(以秒为单位)。 例如,“0:03:26”表示转换后 206 秒。

输入示例:

Source       Month  Sessions    Bounce Rate     Avg. Session Duration   
ABC.com     201501   408        26.47%           0:03:26 
EFG.com     201412   398        31.45%           0:04:03

我写了一个函数:

def time_convert(x):
    times = x.split(':')
    return (60*int(times[0])+60*int(times[1]))+int(times[2])

这个函数工作得很好,只需将 '0:03:26' 传递给函数。但是当我试图通过将函数应用于 Pandas 中的另一列来创建新列“持续时间”时,

df = pd.read_csv('myfile.csv')
df['Duration'] = df['Avg. Session Duration'].apply(time_convert)

它返回了一条错误消息:

> --------------------------------------------------------------------------- AttributeError                            Traceback (most recent call
> last) <ipython-input-53-01e79de1cb39> in <module>()
> ----> 1 df['Avg. Session Duration'] = df['Avg. Session Duration'].apply(lambda x: x.split(':'))
> 
> /Users/yumiyang/anaconda/lib/python2.7/site-packages/pandas/core/series.pyc
> in apply(self, func, convert_dtype, args, **kwds)    1991            
> values = lib.map_infer(values, lib.Timestamp)    1992 
> -> 1993         mapped = lib.map_infer(values, f, convert=convert_dtype)    1994         if len(mapped) and
> isinstance(mapped[0], Series):    1995             from
> pandas.core.frame import DataFrame
> 
> /Users/yumiyang/anaconda/lib/python2.7/site-packages/pandas/lib.so in
> pandas.lib.map_infer (pandas/lib.c:52281)()
> 
> <ipython-input-53-01e79de1cb39> in <lambda>(x)
> ----> 1 df['Avg. Session Duration'] = df['Avg. Session Duration'].apply(lambda x: x.split(':'))
> 
> AttributeError: 'float' object has no attribute 'split'

我不知道为什么它说“平均”的值。会话持续时间'是浮动的。

Data columns (total 7 columns):
Source                   250 non-null object
Time                     251 non-null object
Sessions                 188 non-null object
Users                    188 non-null object
Bounce Rate              188 non-null object
Avg. Session Duration    188 non-null object
% New Sessions           188 non-null object
dtypes: object(7)

谁能帮我找出问题所在?

【问题讨论】:

    标签: python csv time pandas dataframe


    【解决方案1】:

    df['Avg. Session Duration'] 应该是你的函数工作的字符串。

    df =pd.DataFrame({'time':['0:03:26']})
    
    def time_convert(x):
        h,m,s = map(int,x.split(':'))
        return (h*60+m)*60+s
    
    df.time.apply(time_convert)
    

    这对我来说很好。

    【讨论】:

    • time_convert() 不正确。应该是:(60*int(times[0])+int(times[1]))*60+int(times[2])
    • 感谢您的指出!没有注意到错误,因为没有一个持续时间超过一个小时
    【解决方案2】:

    您可以使用标准 python 库中的 timedatetime 将时间转换为秒:

    import time, datetime
    def convertTime(t):
        x = time.strptime(t,'%H:%M:%S')
        return str(int(datetime.timedelta(hours=x.tm_hour,minutes=x.tm_min,seconds=x.tm_sec).total_seconds()))
    
    convertTime('0:03:26') # Output 206.0
    convertTime('0:04:03') # Output 243.0
    

    【讨论】:

    • 感谢您的回复!当我只将单个字符串传递给该函数时它有效,但当我将该函数应用于列时无效----> df['Duration'] = df['Avg.会话持续时间'].apply(convertTime)。它返回了这个错误 = TypeError: expected string or buffer
    【解决方案3】:

    错误表示该列被识别为浮点数,而不是字符串。修复读取数据的方式,例如:

    #!/usr/bin/env python
    import sys
    import pandas
    
    def hh_mm_ss2seconds(hh_mm_ss):
        return reduce(lambda acc, x: acc*60 + x, map(int, hh_mm_ss.split(':')))
    
    df = pandas.read_csv('input.csv', sep=r'\s{2,}',
                         converters={'Avg. Session Duration': hh_mm_ss2seconds})
    print(df)
    

    输出

        Source   Month  Sessions Bounce Rate  Avg. Session Duration
    0  ABC.com  201501       408      26.47%                    206
    1  EFG.com  201412       398      31.45%                    243
    
    [2 rows x 5 columns]
    

    【讨论】:

    • 感谢您的回复!我尝试了你的方法,但它没有改变,只是输出了一个看起来很奇怪的非结构化数据框。我认为最初的错误可能在 read_csv 语法中......你能解释一下 r'\s{2' 的作用以及为什么要传递这些符号吗?
    • @Yumi:代码可以很好地从您的问题中读取输入。如果这不是您的实际输入,请更新您的问题。 '\s{2,}' 是用于分隔符的正则表达式——同一行的字段之间有两个或多个空格(任何空格)。
    猜你喜欢
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多