【问题标题】:Convert and order time in a pandas df在 pandas df 中转换和订购时间
【发布时间】:2018-12-25 19:31:41
【问题描述】:

我想在pandasdf 中订购timestamps。时间从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)

【问题讨论】:

  • 一种简单的方法是将date 部分(使用日期时间)添加到时间值,并使时间值“大于”与第二天关联的“24:00:00”。哪个日期似乎与您的情况无关。
  • 谢谢@nanoix9,布拉德·所罗门。时间永远不会超过凌晨 3 点至凌晨 4 点。我能不能把它应用到那些时间里的任何东西上。因此,消除了上午 8 点到 12 点的时间。
  • @nanoix9。从技术上讲,我会将数据集中的所有内容视为“一个日期”。尽管它跨越了两个。但我可以轻松替换它。
  • @PeterJames123 如果时间永远不会超过凌晨 4 点,我会有一个更好的主意。为什么不把所有时间都减去 4 小时?(但记得在凌晨 3 点至凌晨 4 点之间的时间先加上 24 小时)。这样一来,所有时间都将在 0 ~ 24 的范围内,也称为“一个日期”。您可以轻松地将它们添加回来。
  • 我正在将时间戳与另一个数据集对齐,因此它们必须是 0-27

标签: python pandas time timedelta


【解决方案1】:

为午夜之后和应该开始新“一天”之前的时间添加一个日期偏移量(选择凌晨 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 2017-03-29
    • 2018-11-30
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多