【问题标题】:How to efficiently order time python如何有效地订购时间python
【发布时间】:2018-10-22 13:13:37
【问题描述】:

抱歉标题含糊。这个问题更容易展示。

我有一个按时间排序的数据框。我想将其转换为总秒数。问题是时间从 08:00:00 AM 到 03:00:00 AM。因此,在时间从 23:59:59 到 00:00:00 之前,总秒数是可以的。

一些时间戳的示例是:

['23:45:00'
'23:45:00'
'23:47:00'
'23:49:00'
'23:55:00'
'00:10:00'
'00:10:00'
'00:10:00'
'01:05:00'
'01:08:00'
'01:10:00'
'01:15:00'
'02:05:00'
'02:07:00'
'03:05:00'
'03:10:00'
'03:15:00'
'03:25:00']

所以总秒数直到午夜都可以。然后它又开始了。目前,我正在通过在午夜后添加 24 小时来修改这一点。

df['Time'] = pd.DatetimeIndex(df['Time']) + timedelta(hours=24)

如果您必须索引适当的行然后添加 n 小时数,那么所有这些都不是很有效。

我不确定这是否有用,但我在下面附上了一些生成随机时间戳的代码:

import pandas as pd
import random
from datetime import timedelta

def randomTime():

    rtime = int(random.random()*86400)

    hours   = int(rtime/3600)
    minutes = int((rtime - hours*3600)/60)
    seconds = rtime - hours*3600 - minutes*60

    time_string = '%02d:%02d:%02d' % (hours, minutes, seconds)
    return time_string

time = [randomTime() for _ in range(8)]

k = 5
N = 8

d = ({'Time' : (time)})

df = pd.DataFrame(data=d)

【问题讨论】:

  • 为什么要在午夜后的第二个小时加上 25 小时,以此类推?除非我完全误解了你的问题,否则你想把1:05 变成 25 小时 5 分钟。您可以通过将 24 小时加到 1,而不是 25 到 1 来做到这一点。(在这种情况下,您不需要任何类型的显式循环,只需 s[s<s[0]] += timedelta(hours=24)。)

标签: python pandas time timedelta


【解决方案1】:

我完全同意 @abarnet 的评论,即每次下降时您应该添加 24 小时,而不是 25 小时。

使用上面的示例找到增量的有效方法可能是

>>> (pd.to_datetime(df.Time) < pd.to_datetime(df.Time).shift(1)).cumsum() * pd.Timedelta(hours=24)
0    0 days
1    0 days
2    0 days
3    0 days
4    0 days
5    1 days
6    1 days
7    1 days
8    1 days
9    1 days
10   1 days
11   1 days
12   1 days
13   1 days
14   1 days
15   1 days
16   1 days
17   1 days
Name: Time, dtype: timedelta64[ns]

这个

  • 检查时间是否相对于前一行下降
  • 查找发生这种情况的累计次数
  • 将其转换为 24 小时的 timedelta 次数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 2017-10-03
    • 2019-03-08
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多