【问题标题】:formatting timedelta64 when using pandas.to_excel使用 pandas.to_excel 时格式化 timedelta64
【发布时间】:2017-10-02 09:47:41
【问题描述】:

我正在使用 ExcelWriter 写入 excel 文件:

writer = pd.ExcelWriter(fn,datetime_format=' d  hh:mm:ss')
df.to_excel(writer,sheet_name='FOO')

写入操作成功并打开相应的 excel 文件,我看到日期时间按照要求很好地格式化了。但是,数据框的另一列 dtype timedelta64[ns] 会自动转换为数值,所以在 Python 中我看到了

0 days 00:23:33.499998

在 Excel 中:

 0.016359954

这可能与转换为天数的持续时间相同。 有什么方法可以使用pd.ExcelWriter?控制时间增量格式@

【问题讨论】:

    标签: python pandas timedelta


    【解决方案1】:

    Excel 没有 timedelta 或等效的数据类型,因此您有几个不完美的选择。

    要在 Excel 中保留它们的“日期时间性”,您可以转换为日期时间,然后在 Excel 中以仅显示时间部分的格式显示它们。

    df = pd.DataFrame({'td': [pd.Timedelta(1, 'h'), pd.Timedelta(1.5, 'h')]})
    df['td_datetime']
    df['td_datetime'] = df['td'] + pd.Timestamp(0)
    
    writer = pd.ExcelWriter('tmp.xlsx', datetime_format='hh:mm:ss')
    df.to_excel(writer)
    # tmp.xlsx
    # td         td_datetime
    # 0.041667   01:00:00
    # 0.0625     01:30:00
    

    或者,您可以在序列化之前格式化为字符串:

    df['td_str'] = df['td'].astype(str)
    
    df
    Out[24]: 
            td                     td_str
    0 01:00:00  0 days 01:00:00.000000000
    1 01:30:00  0 days 01:30:00.000000000
    

    【讨论】:

      【解决方案2】:

      对上述内容的一些补充。

      Excel 零日期是 1-1-1900,而 pandas.TimeStamp(0) 给我的是 1-1-1970。

      所以,我将代码更改为

      df['td_datetime'] = df['td'] + pd.Timestamp('1900-01-01')
      

      现在它可以正常工作了(并且您可以正确添加单元格以添加时间增量)

      您也可能只想显示小时数(不是 1 天 1 小时,而是 25 小时),为此您可以使用以下格式:

      writer = pd.ExcelWriter('tmp.xlsx', datetime_format='[h]:mm:ss')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-29
        • 2021-07-28
        • 1970-01-01
        • 2022-08-19
        相关资源
        最近更新 更多