【问题标题】:Attribute Error: Converting hh:mm:ss to decimal in Python [duplicate]属性错误:在 Python 中将 hh:mm:ss 转换为十进制 [重复]
【发布时间】:2019-03-08 03:17:20
【问题描述】:

解决方案更新:从上面提供的链接,这是我想出的:

import pandas as pd
import numpy as np

df = pd.read_csv('Book1.csv')
df = df.set_index(pd.DatetimeIndex(df['Duration']))
idx = pd.DatetimeIndex(df['Duration'])
df['Duration_Decimal'] = idx.hour + idx.minute / 60

文件开始

import pandas as pd
from pandas import ExcelWriter
from pandas import ExcelFile
from datetime import datetime

df = pd.read_excel('Book1.xlsx', sheet_name='Sheet1')

这是我要转换的列:

In: df.Duration.head()
Out: 0    01:30:00
     1    00:00:00
     2    00:30:00
     3    00:30:00
     4    00:00:00
     Name: Duration, dtype: object

还有我做的功能:

def conversion_function(t):
    (h, m, s) = t.split(':')
    return int(h) + int(m)/60 + int(s)

测试功能:

In: conversion_function('01:30:00')
Out: 1.5

向数据框插入新列 (Duration_2) 并执行转换函数(带有 AttributeError):

df['Duration_2'] = df['Duration'].apply(conversion_function)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-4-ad23f30d9b5a> in <module>()
----> 1 df['Duration_2'] = df['Duration'].apply(conversion_function)

D:\Python\lib\site-packages\pandas\core\series.py in apply(self, func, 
convert_dtype, args, **kwds)
   3190             else:
   3191                 values = self.astype(object).values
-> 3192                 mapped = lib.map_infer(values, f, 
                        convert=convert_dtype)
   3193 
   3194         if len(mapped) and isinstance(mapped[0], Series):

pandas/_libs/src\inference.pyx in pandas._libs.lib.map_infer()

<ipython-input-3-d662e6fcae47> in conversion_function(t)
      1 def conversion_function(t):
----> 2     (h, m, s) = t.split(':')
      3     return int(h) + int(m)/60 + int(s)

AttributeError: 'datetime.time' object has no attribute 'split'

当我单独使用该功能时,它可以工作,但无论我尝试如何调整它,我似乎只是让它在数据框中工作。

【问题讨论】:

    标签: python pandas time


    【解决方案1】:

    您的数据似乎已采用日期时间格式。不过,您的 conversion_function 期望使用字符串,这就是您收到错误的原因(split() 适用于字符串)。

    由于您使用的是 Pandas,我建议您使用内置的 Pandas 日期操作方法:

    data = ["01:30:00", "00:00:00", "00:30:00", "00:30:00", "00:00:00"]
    time_data = pd.to_datetime(data)
    
    time_data.hour + time_data.minute / 60
    # Float64Index([1.5, 0.0, 0.5, 0.5, 0.0], dtype='float64')
    

    注意:您收到的错误表明您有 datetime.time 格式的时间数据 - 您也可以使用 datetime.time 中的相同方法,而不是转换为 Pandas 特定的日期时间对象:

    # match OP's exact time format 
    time_data = [datetime.datetime.strptime(x, "%H:%M:%S").time() for x in data]
    
    [x.hour + x.minute/60 for x in time_data]
    # [1.5, 0.0, 0.5, 0.5, 0.0]
    

    【讨论】:

    • 参考 OP,我已经包含了解决方案。 〜问候。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 2014-07-02
    • 1970-01-01
    相关资源
    最近更新 更多