在熊猫df中转换和订购时间

时间:2018-07-18 02:04:16

标签: python pandas time timedelta

我正在尝试在timestamps pandas中订购df。时间从08:00:00 am开始,到3:00:00 am附近结束。我想将午夜后的时间增加24小时。因此,时间从08:00:0027:00:00 am。问题是时间没有秩序。

示例:

import pandas as pd

d = ({           
    'time' : ['08:00:00 am','12:00:00 pm','16:00:00 pm','20:00:00 pm','2:00:00 am','13:00:00 pm','3:00:00 am'], 
     })

df = pd.DataFrame(data=d)

如果我尝试通过以下方式订购时间

df = pd.DataFrame(data=d)
df['time'] = pd.to_timedelta(df['time'])
df = df.sort_values(by='time',ascending=True)

出局:

 time
4 02:00:00
6 03:00:00
0 08:00:00
1 12:00:00
5 13:00:00
2 16:00:00
3 20:00:00

我希望输出是:

       time
0  08:00:00
1  12:00:00
2  13:00:00
3  16:00:00
4  20:00:00
5  26:00:00
6  27:00:00

我不确定是否可以做到。具体来说,如果我可以区分8:00:00 am和午夜(1am-3am)之后的时间。

1 个答案:

答案 0 :(得分:0)

为午夜之后和应该开始新的“一天”之前的时间添加一天的偏移量(在凌晨3点之后和7点之前选择一些时间),然后对值进行排序

cutoff, day = pd.to_timedelta(['3.5H', '24H'])
df.time.apply(lambda x: x if x > cutoff else x + day).sort_values().reset_index(drop=True)

# Out:
0   0 days 08:00:00
1   0 days 12:00:00
2   0 days 13:00:00
3   0 days 16:00:00
4   0 days 20:00:00
5   1 days 02:00:00
6   1 days 03:00:00

最后两个值在数值上分别等于26小时和27小时,只是显示方式不同。

如果您需要采用HH:MM:SS格式,请使用字符串格式以及相应的时间增量组件

例如:

x = df.time.apply(lambda x: x if x > cutoff else x + day).sort_values().reset_index(drop=True).dt.components

x.apply(lambda x: '{:02d}:{:02d}:{:02d}'.format(x.days*24+x.hours, x.minutes, x.seconds), axis=1)

#Out:
0    08:00:00
1    12:00:00
2    13:00:00
3    16:00:00
4    20:00:00
5    26:00:00
6    27:00:00
dtype: object