2 回答
TA贡献2039条经验 获得超7个赞
根据数据分析,我可以得出结论,hh 部分的小数位实际上是天。示例 2.4:30:30 = 2 天 4 小时 30 分钟 30 秒。
def cleanhours(x):
hms=x.split(":")
dh=hms[0].split(".")
if len(dh)>1:
hms[0]=str(int(dh[-1])+24*int(dh[-2]))
hms[2] = hms[2].split(".")[0]
return int(hms[0])+int(hms[1])/60.0+int(hms[2])/3600.0
# return ":".join(hms)
TA贡献1815条经验 获得超10个赞
似乎是一个奇怪的错误,因为我从未见过像这样来自 azure 的任何日志 - 无论如何,除非有一些内置方法来处理这样的数据,否则我们将需要手动解析它。
在重新创建时间增量字符串之前,我们将拆分:然后舍入数字。
我必须明确地说,这不是真正的解决方法,因为您需要限定什么1.05是 1 小时零 x 分钟?
如果您不关心以上内容,那么以下内容应该有效。
方法 1 无精度,字符串格式。
print(df)
Duration
0 1.05:27:39.9470724
1 21:17.7
2 21:41.4
3 1.02:42:37.1136811
4 21:17.2
df['DurationFixed'] = pd.to_timedelta(df['Duration'].str.split(':',expand=True)\
.stack()\
.astype(float)\
.round()\
.astype(int).astype(str).unstack(1).fillna('00').agg(':'.join,axis=1),
unit='s')
print(df)
Duration DurationFixed
0 1.05:27:39.9470724 01:27:40
1 21:17.7 21:18:00
2 21:41.4 21:41:00
3 1.02:42:37.1136811 01:42:37
4 21:17.2 21:17:00
如果你只想要几个小时,你可以使用np.timedelta64
import numpy as np
df['DurationFixed'] / np.timedelta64(1,'h')
0 1.461111
1 21.300000
2 21.683333
3 1.710278
4 21.283333
Name: DurationFixed, dtype: float64
方法 2 更精确。
如果您的数据格式相同 - 即Hours : Minutes : Seconds
我们可以堆叠并应用累积计数并映射元数据字段以pd.to_timedelta在行级别使用我们的。
s = df['Duration'].str.split(':',expand=True)\
.stack()\
.astype(float).to_frame('time_delta')
print(s)
time_delta
0 0 1.050000
1 27.000000
2 39.947072
1 0 21.000000
1 17.700000
2 0 21.000000
1 41.400000
3 0 1.020000
1 42.000000
2 37.113681
4 0 21.000000
1 17.200000
s['metadata'] = s.groupby(level=0).cumcount().map({0 : 'h', 1 : 'm', 2 : 's' })
print(s)
time_delta metadata
0 0 1.050000 h
1 27.000000 m
2 39.947072 s
1 0 21.000000 h
1 17.700000 m
2 0 21.000000 h
1 41.400000 m
3 0 1.020000 h
1 42.000000 m
2 37.113681 s
4 0 21.000000 h
1 17.200000 m
apply最后,我们在行级别使用 an将每一行转换为它的 repective 格式并四舍五入到最接近的n秒数。我选了10个。
df['DurationPrecise'] = s.apply(lambda x : pd.to_timedelta(x.time_delta,
x.metadata,errors='coerce'),axis=1)\
.groupby(level=0).sum().dt.round('10s')
print(df)
Duration DurationFixed DurationPrecise
0 1.05:27:39.9470724 01:27:40 01:30:40
1 21:17.7 21:18:00 21:17:40
2 21:41.4 21:41:00 21:41:20
3 1.02:42:37.1136811 01:42:37 01:43:50
4 21:17.2 21:17:00 21:17:10
添加回答
举报