代码之家  ›  专栏  ›  技术社区  ›  Gary Harrison

如何从csv文件中的特定列读取十进制数将其转换为HH。MM和总小时数

  •  0
  • Gary Harrison  · 技术社区  · 6 年前

    我试图创建一个程序来读取csv文件中第一行和第六行的十进制数字,然后将这些数字转换为HH。嗯。然后合计小时数并输出。

    这是我目前的代码

    import csv
    
    with open("tracking_original2.csv") as f:
      reader = csv.reader(f, delimiter=',')
      rows = csv.reader(f)
      for row in rows:
        print(row[1],' ',row[6])
    
    This outputs:
    Customer   1
    Customer   0.5
    Customer   0.93
    Customer   1.2
    Customer   0.73
    Customer   0.5
    Customer   0.54
    Customer   0.13
    Customer   0.56
    Customer   0.99
    

    我完全不知道如何继续。有人能帮忙吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Patrick Artner    6 年前

    你把你的小时数加起来,再乘以60,得到分钟数。然后提取完整小时数和剩余分钟数:

    minutes = sum( [ 1 , 0.5 , 0.93 , 1.2 , 0.73 , 0.5 , 0.54 , 0.13 , 0.56 , 0.99 ]) * 60 
    print( f'{int(minutes//60):02d}:{int(minutes)%60:02d}')
    

    打印使用格式来获取00:00格式:请参见 format mini languague format string syntax

    我使用整数地板除法 // 获取完整的整数部分和模 % 以获取剩余的分钟数。通过将结果转换为 int() 输出:

    07:04
    

    您还可以使用fancy并将其包装到函数中:

    def asHourString(decimalPlacesHours):
        """Converts decimal workhours into HH:MM format. 
    
        Works with int,float and list of float-convertables, else
        throws ValueError"""
    
        minutes = 0.0
        if isinstance(decimalPlacesHours,float) or isinstance(decimalPlacesHours,int) :
            minutes = decimalPlacesHours * 60
        elif isinstance(decimalPlacesHours,list) and decimalPlacesHours:
            try:
                minutes = sum(map(float,decimalPlacesHours))
            except (ValueError,IndexError):
                raise ValueError("Supply float or list convertable to float")
        else:   
            raise ValueError("Supply float or list convertable to float") 
    
        return f'{int(minutes//60):02d}:{int(minutes)%60:02d}'   
    
    print(asHourString(21.49))
    print(asHourString([21.49,2.12]))
    print(asHourString(["21.49","2.12"])) 
    print(asHourString(-5))
    # print(asHourString("does not work")) # ValueError
    

    输出:

    21:29
    00:23
    00:23
    -5:00