使用熊猫以字符串形式读取时间

时间:2020-07-08 13:54:35

标签: python pandas

我正在使用python3中的pandas阅读excel。 excel有一列记录,以分钟为单位,每条记录花费时间。第二列显示为3:52是在该特定步骤中花费了3分52秒,而不是pandas df所说的“ 3:52:00 AM”。有办法避免吗? 数据在excel中的外观如下:

Excel data

值56:52:00实际上是上述Excel中的56分52秒(同样)。 excel列中的数据严格按照标头时间(mm:ss)中定义的格式..在某些工作表中,它可能是时间(hh:mm:ss)

这是我创建df的方法:

>>> df = xl.parse(sheet_name,header=None,encoding="utf-8", skiprows=3,usecols={1})
>>> df
                       1
0               03:52:00
1               04:52:00
2               05:52:00
3               06:52:00
4               07:52:00
..                   ...
115  1900-01-02 08:52:00
116  1900-01-02 09:52:00
117  1900-01-02 10:52:00
118  1900-01-02 11:52:00
119             00:52:00

>>> df.dtypes
1    object
dtype: object

2 个答案:

答案 0 :(得分:0)

这应该为您工作。当pandas使用pandas.read_excel()读取excel文件时,它将持续时间作为时间(HH:MM:SS)引入,其中3表示小时,52表示分钟或日期时间(YYYY-MM-DD HH: MM:SS)。

      0                 1
0     1              03:52:00    (time object)
118   1   1900-01-02 08:52:00    (datetime object)
119   1              00:52:00    (time object)

代码将创建一个函数,通过从时间中减去午夜(date.min)并将其除以60,将时间转换为时间增量(HH:MM:SS-以3为分钟,以52为秒)持续时间以分钟和秒为单位,而不是小时和分钟。

      0      1
0     1   00:03:52    (timedelta object)
118   1   00:56:52    (timedelta object)
119   1   00:00:52    (timedelta object)

您可以使用timedelta模块来修改持续时间的显示方式。可能有一个更好的方法可以将持续时间读取为TimeDelta,但我不确定如何做到这一点。

import pandas as pd
from datetime import datetime, date

df=pd.read_excel("filepath")
def convert_to_duration(timeobj):
    if type(timeobj) == datetime:
        datetimemin = datetime.strptime("1899-12-31 00:00:00","%Y-%m-%d %H:%M:%S")
        return (timeobj - datetimemin)/60
    if type(timeobj) == time:    
        return (datetime.combine(date.min,timeobj)-datetime.min)/60

df[1]=df[1].apply(convert_to_duration)
df

答案 1 :(得分:-1)

converters时可以使用read_excel() kwarg,并指定要转换类型以使用的列标题名称

import pandas as pd
df = pd.read_excel('Data.xlsx', converters={'col':str})

dtype kwarg

import pandas as pd
df = pd.read_excel('Data.xlsx', dtype={'col':str})