代码之家  ›  专栏  ›  技术社区  ›  yoonghm

使用pandas从Microsoft Excel中的2“hh:mm:ss xx”列执行时间增量

  •  0
  • yoonghm  · 技术社区  · 7 年前

    我有一个名为 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
    

    现在的问题变成了:“使用pandas从microsoft excel中的2个“hh:mm:ss xx”列执行时间增量”。我也改了题目。谢谢你的回复和尝试。

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   ayorgo    7 年前

    看来 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