【问题标题】:Need to read excel dates as decimals without automatically converting to date time需要以小数形式读取 excel 日期而不自动转换为日期时间
【发布时间】:2019-12-03 22:10:35
【问题描述】:

我正在阅读一个 Excel 工作表,该工作表的列 'Time (hr)' 以小时、分钟、秒为单位,格式如下:64:45:00 我需要将其转换为 64.75 小时 当我用 read_excel 阅读它时,它会自动将其转换为 1900-01-02 16:45

我曾尝试在 read_excel 函数中使用 dtype、转换器、date_parse 选项,但总是出错

data = xl.parse(header = [0], dtype = {'Time (hr)': np.float64})

TypeError: float() argument must be a string or a number, not 'datetime.datetime'

编辑: 我发现 Time (hr) 列中的一些值小于 24 小时,因此仅作为时间读入。例如 10:45:00 只是作为时间读入,所以当我尝试解决方案时出现此错误:

TypeError: 不支持的操作数类型 -: 'datetime.time' 和 'datetime.datetime'

【问题讨论】:

    标签: excel pandas


    【解决方案1】:

    您可以尝试使用以下代码test_df = xl.parse(name)首先从 excel 文件中创建数据框

    然后将日期列转换为 int 类型,例如test_df['Time (hr)'].dt.strftime("%Y-%m-%d %H:%M").astype(int)

    【讨论】:

    • 当我这样做时,我得到这个错误:AttributeError: Can only use .dt accessor with datetimelike values
    • 你可以看看这个答案:stackoverflow.com/a/46502880/6908282
    【解决方案2】:

    这是我的测试文件dates.xlsx 的样子:

    像往常一样读入并解析日期:

    df = pd.read_excel('dates.xlsx', parse_dates=['Time (hr)'])
    
                Time (hr)
    0 1900-01-02 16:45:00
    1 1900-01-02 07:10:00
    2 1900-01-05 15:59:01
    

    Excel 的第一天是 1900 年 1 月 1 日,所以零是:

    epoch = dt.datetime(1899, 12, 31)
    

    减去纪元得到timedelta,然后转换为总秒数:

    df['seconds'] = (df['Time (hr)'] - epoch).dt.total_seconds()
    
                Time (hr)   seconds
    0 1900-01-02 16:45:00  233100.0
    1 1900-01-02 07:10:00  198600.0
    2 1900-01-05 15:59:01  489541.0
    

    制作总小时数列:

    df['hours'] = df.seconds / 3600
    
                Time (hr)   seconds       hours
    0 1900-01-02 16:45:00  233100.0   64.750000
    1 1900-01-02 07:10:00  198600.0   55.166667
    2 1900-01-05 15:59:01  489541.0  135.983611
    

    【讨论】:

      猜你喜欢
      • 2015-10-25
      • 1970-01-01
      • 1970-01-01
      • 2020-05-12
      • 2017-03-08
      • 1970-01-01
      • 2017-09-02
      • 2020-11-30
      • 1970-01-01
      相关资源
      最近更新 更多