使用pandas.to_excel时格式化timedelta64s

时间:2017-10-02 09:47:42

标签: python pandas

我使用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来控制timedelta格式?

2 个答案:

答案 0 :(得分:4)

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

要在Excel中保留“datetime-ness”,您可以转换为日期时间,然后使用仅显示时间部分的格式在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

答案 1 :(得分:1)

上述内容的补充。

Excel零日期是1-1-1900,而if ($user) { if (\Crypt::decrypt($user->code) == $decrypted) { Auth::login($user); return redirect()->intended('dashboard')->with('success'); } } return Redirect::back()->with('error'); } 给我的是1-1-1970。

所以,我将代码更改为

pandas.TimeStamp(0)

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

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

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