我正在尝试在timestamps
pandas
中订购df
。时间从08:00:00 am
开始,到3:00:00 am
附近结束。我想将午夜后的时间增加24小时。因此,时间从08:00:00
到27: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)
之后的时间。
答案 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