【问题标题】:How To Get The Time Interval of a Column in Pandas如何在 Pandas 中获取列的时间间隔
【发布时间】:2022-01-20 10:32:42
【问题描述】:

我有一个数据框,它只包含字符串格式的时间(dtype:object)。我想知道的是如何创建一个包含行重合的时间间隔的新列?我在下面提供了一些示例数据:

    Loss Time
0   02:10
1   22:20
2   20:00
3   01:20
4   12:36

我想创建一个包含 10AM-4PM、4PM-8PM、8PM-6AM 和 6AM-10AM 区间的列。我尝试了多种不同的方法,但没有发现任何成功。 pandas between_time 函数不起作用,因为它需要索引作为我不能做的日期时间索引,我尝试查看 strptime 但在那里没有成功。任何想法将不胜感激。

【问题讨论】:

    标签: python pandas datetime


    【解决方案1】:

    使用cut的简单解决方案

    输入:

    TESTDATA = StringIO("""Loss_Time
    02:10
    22:20
    20:00
    01:20
    12:36
    05:30
    23:59
    5:00
    9:30
    11:30
    14:30
    16:30
    21:20
        """)
    df = pd.read_csv(TESTDATA, sep=";")
    

    代码:

    df.Loss_Time = pd.to_datetime(df.Loss_Time).dt.strftime('%H:%M')
    bins = [0,6,10,16,20,24]
    labels = ['8PM-6AM','6AM-10AM','10AM-4PM','4PM-8PM','8PM-6AM']
    df['Time Bin'] = pd.cut(pd.to_datetime(df.Loss_Time).dt.hour, bins, labels=labels, right=False,ordered=False)
    

    打印:

       Loss_Time    Time Bin
    0   02:10   8PM-6AM
    1   22:20   8PM-6AM
    2   20:00   8PM-6AM
    3   01:20   8PM-6AM
    4   12:36   10AM-4PM
    5   05:30   8PM-6AM
    6   23:59   8PM-6AM
    7   05:00   8PM-6AM
    8   09:30   6AM-10AM
    9   11:30   10AM-4PM
    10  14:30   10AM-4PM
    11  16:30   4PM-8PM
    12  21:20   8PM-6AM
    

    【讨论】:

      【解决方案2】:

      只需将其解析为日期时间并定义所需的括号。

      from datetime import datetime
      import pandas as pd
      
      foo = pd.Series(['02:10', '22:20','20:00','01:20', '12:36'])
      foo_df = pd.DataFrame(foo)
      def time_into_bracket(time_str):
          time = datetime.strptime(time_str, "%H:%M").time()
          bracket1 = datetime.strptime('00:00', "%H:%M").time()
          bracket2 = datetime.strptime('08:00', "%H:%M").time()
          bracket3 = datetime.strptime('16:00', "%H:%M").time()
          if time >= bracket1 and time < bracket2:
              return '00:00 - 08:00'
          elif time >= bracket2 and time < bracket3:
              return '08:00 - 16:00'
          else:
              return '16:00 - 24:00'
          
      foo_df['time_bracket'] = foo_df[0].apply(time_into_bracket)
      

      结果:

      0    00:00 - 08:00  
      1    16:00 - 24:00  
      2    16:00 - 24:00  
      3    00:00 - 08:00  
      4    08:00 - 16:00  
      

      【讨论】:

        【解决方案3】:
        df['Loss Time'] = pd.to_datetime(df['Loss Time'])
        >>> df
                    Loss Time
        0 2021-12-17 02:10:00
        1 2021-12-17 22:20:00
        2 2021-12-17 20:00:00
        3 2021-12-17 01:20:00
        4 2021-12-17 12:36:00
        >>>
        >>> import time
        >>> df['Loss Time'] = [time.time() for time in df['Loss Time']]
        >>>
        >>> df
          Loss Time
        0  02:10:00
        1  22:20:00
        2  20:00:00
        3  01:20:00
        4  12:36:00
        >>>
        

        通过这样做,您可以转换那些包含时间对象的字符串。然后,您可以过滤它们并将它们与您想要的不同时间进行比较(检查时间是否在另外两个时间之间)。

        【讨论】:

          猜你喜欢
          • 2020-03-25
          • 2020-02-14
          • 1970-01-01
          • 2022-01-20
          • 2022-01-17
          • 2018-10-20
          • 2020-01-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多