为了账号安全,请及时绑定邮箱和手机立即绑定

如何将 Azure 备份报告持续时间列转换为带十进制数的日期时间

如何将 Azure 备份报告持续时间列转换为带十进制数的日期时间

繁花不似锦 2023-03-01 15:38:05
Azure 云备份报告中的 Duration 列似乎有一个有趣的时间格式(小时后和分钟后为十进制)。你能帮忙把小时、分钟和秒部分四舍五入,使该列以小时为单位吗?1.05:27:39.947072421:17.721:41.41.02:42:37.113681121:17.2我试图格式化微秒部分,但不确定如何解决小时部分中的这些小数。很高兴排除这些小数。appended_data['Duration'] = pd.to_datetime(appended_data['Duration'], format='%H:%M:%S.%f')ValueError: time data '1.05:27:39.9470724' does not match format '%H:%M:%S.%f' (match)appended_data['Backup Size'] = appended_data['Backup Size'].str.replace('MB','')appended_data['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')appended_data['DurationHours'] = appended_data['DurationFixed'] / np.timedelta64(1,'h')appended_data['Duration']1    04:01:22.77561391    03:31:17.06782621    04:41:32.72537651    03:11:18.33965881    04:51:20.2017034           ...       1    02:21:17.85540951    02:21:19.55470751    03:41:23.88768121    02:21:32.55291601    02:01:20.3247238appended_data['DurationFixed']1   02:01:201   02:01:201   02:01:201   02:01:201   02:01:20      ...   1   02:01:201   02:01:201   02:01:201   02:01:201   02:01:20谢谢
查看完整描述

2 回答

?
largeQ

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)


查看完整回答
反对 回复 2023-03-01
?
动漫人物

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


查看完整回答
反对 回复 2023-03-01
  • 2 回答
  • 0 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信