使用熊猫从Microsoft Excel中的2个“ hh:mm:ss XX”列执行时间增量

时间:2018-12-06 11:01:59

标签: python pandas

我有一个Excel文件,其中的列名为StartTime,具有hh:mm:ss XX数据,并且单元格采用“ h:mm:ss AM / FM”自定义格式。例如,

ID    StartTime
1     12:00:00 PM
2      1:00:00 PM
3      2:00:00 PM

我使用以下代码读取文件

df = pd.read_excel('./mydata.xls',
                   sheet_name='Sheet1',
                   converters={'StartTime' : str},
                   )

df显示

ID  StartTime
1   12:00:00
2    1:00:00
3    2:00:00

是一个错误还是您如何克服这个问题?谢谢。

[更新:2018年12月7日]

我想我可能已经对Excel文件进​​行了更改,使其变得很奇怪。我创建了另一个Excel文件并显示在此处(我无法在此处附加Excel文件,它也不安全):

enter image description here

我创建了以下代码进行测试:

import pandas as pd

df = pd.read_excel('./Book1.xlsx',
                   sheet_name='Sheet1',
                   converters={'StartTime': str,
                               'EndTime': str                   
                              }
                  )

df['Hours1'] = pd.NaT
df['Hours2'] = pd.NaT

print(df,'\n')

df.loc[~df.StartTime.isnull() & ~df.EndTime.isnull(),
       'Hours1'] = pd.to_datetime(df.EndTime) - pd.to_datetime(df.StartTime)

df['Hours2'] = pd.to_datetime(df.EndTime) - pd.to_datetime(df.StartTime)
print(df)

输出是

   ID StartTime   EndTime Hours1 Hours2
0   0  11:00:00  12:00:00    NaT    NaT
1   1  12:00:00  13:00:00    NaT    NaT
2   2  13:00:00  14:00:00    NaT    NaT
3   3       NaN       NaN    NaT    NaT
4   4  14:00:00       NaN    NaT    NaT 

   ID StartTime   EndTime         Hours1   Hours2
0   0  11:00:00  12:00:00  3600000000000 01:00:00
1   1  12:00:00  13:00:00  3600000000000 01:00:00
2   2  13:00:00  14:00:00  3600000000000 01:00:00
3   3       NaN       NaN            NaT      NaT
4   4  14:00:00       NaN            NaT      NaT

现在问题变成了:“在Microsoft Excel中,使用熊猫从2个“ hh:mm:ss XX”列中执行时间增量”。我也更改了问题的标题。谢谢那些回答并尝试过的人。

问题是 如何将时间值表示为小时而不是微秒?

1 个答案:

答案 0 :(得分:1)

似乎StartTime列的格式设置为文件中的文本。

您是否尝试过使用parse_dates以及通过date_parser参数指定的解析器函数来读取它?尽管文档并未明确列出上述选项read_csv(),但其工作方式应类似于despite them being available

像这样:

pd.read_excel(r'./mydata.xls',
              parse_dates=['StartTime'],
              date_parser=lambda x: pd.datetime.strptime(x, '%I:%M:%S %p').time())

提供更新

pd.read_excel(r'./mydata.xls', parse_dates=['StartTime', 'EndTime'])
(df['EndTime'] - df['StartTime']).dt.seconds//3600

或者

# '//' is available since pandas v0.23.4, otherwise use '/' and round
(df['EndTime'] - df['StartTime'])//pd.Timedelta(1, 'h') 

两者都相同

0    1
1    1
2    1
dtype: int64