首页 > 解决方案 > Pandas 数据帧 timedelta 列以格式化人类可读

问题描述

data = df.groupby(['Jahr','Monat', 'Kunde'])['Dauer'].sum().reset_index(name='TD')

返回:

Jahr | Monat | Kunde | TD
2019 | 7     | C1    | 0 days 08:35:00
2019 | 8     | C1    | 10 days 04:05:00
2019 | 8     | C2    | 0 days 03:25:00
2019 | 9     | C1    | 10 days 09:15:00
2019 | 9     | C6    | 0 days 01:45:00
2019 | 9     | C3    | 0 days 02:30:00
2019 | 9     | C5    | 0 days 00:15:00

TD = 时间增量

我希望在数小时内收到信息,而不是几天

我试过这样的东西: data['TD'] / pd.Timedelta('1 hours')

这将返回10 days 04:05:00 244.083333(十进制小时),但我需要244.05(小时和分钟)

我找到了一些关于如何转换它的技巧,但是有没有很好的方法来把它全部放进去data = df.groupby(['Jahr','Monat', 'Kunde'])['Dauer'].sum().reset_index(name='TD')

编辑 2019-10-07,14:55:

Jahr | Monat | Kunde | TD
2019 | 7     | C1    | 0 days 08:35:00
2019 | 8     | C1    | 10 days 04:05:00
2019 | 8     | C2    | 0 days 03:25:00
2019 | 9     | C1    | 10 days 09:15:00
2019 | 9     | C6    | 0 days 01:45:00
2019 | 9     | C3    | 0 days 02:30:00
2019 | 9     | C5    | 0 days 00:15:00

应该成为

Jahr | Monat | Kunde | TD
2019 | 7     | C1    | 08:35:00
2019 | 8     | C1    | 244:05:00
2019 | 8     | C2    | 03:25:00
2019 | 9     | C1    | 249:15:00
2019 | 9     | C6    | 01:45:00
2019 | 9     | C3    | 02:30:00
2019 | 9     | C5    | 00:15:00

标签: python-3.xpandas

解决方案


首先删除分钟和秒 by Series.dt.floor,转换为字符串并添加零Series.str.zfill,然后添加分钟,并将 slicinf timedeltas 转换为字符串:

floor_h = (data['TD'].dt.floor('H').div(pd.Timedelta('1 hours'))
                   .astype(int)
                   .astype(str)
                   .str.zfill(2))
data['TD'] = floor_h + ':' + data['TD'].astype(str).str[-15:-10]
print (data)
   Jahr  Monat Kunde         TD
0  2019      7    C1   08:35:00
1  2019      8    C1  244:05:00
2  2019      8    C2   03:25:00
3  2019      9    C1  249:15:00
4  2019      9    C6   01:45:00
5  2019      9    C3   02:30:00
6  2019      9    C5   00:15:00

推荐阅读