【问题标题】:how to add hour to pandas dataframe column如何将小时添加到熊猫数据框列
【发布时间】:2016-05-04 02:18:16
【问题描述】:

我有一个如下所示的 pandas 数据帧时间列。

 segments_data['time']
 Out[1585]: 
 0      04:50:00
 1      04:50:00
 2      05:00:00
 3      05:12:00
 4      06:04:00
 5      06:44:00
 6      06:44:00
 7      06:47:00
 8      06:47:00
 9      06:47:00

我想在上述时间列中添加 5 小时 30 分钟。 我正在 python 中进行跟踪。

pd.DatetimeIndex(segments_data['time']) + pd.DateOffset(hours=5,minutes=30)

但它给了我一个错误。

TypeError: object of type 'datetime.time' has no len()

请帮忙。

【问题讨论】:

    标签: python pandas datetime dataframe


    【解决方案1】:

    从 '0.25.3' 开始,这就像

    df[column] = df[column] + pd.Timedelta(hours=1)
    

    【讨论】:

      【解决方案2】:

      您可以尝试导入timedelta

      from datetime import datetime, timedelta
      

      然后:

      segments_data['time'] = pd.DatetimeIndex(segments_data['time']) + timedelta(hours=5,minutes=30)
      

      【讨论】:

        【解决方案3】:

        Pandas 不支持datetime.time 对象的矢量化操作。对于高效的矢量化操作,无需使用标准库中的datetime 模块。

        您有几个选项可以矢量化您的计算。如果您的时间代表持续时间,请使用 Pandas timedelta 系列。如果您的时间代表特定的时间点,或者使用 Pandas datetime 系列。

        选择完全取决于您的数据代表什么。

        timedelta系列

        df['time'] = pd.to_timedelta(df['time'].astype(str)) + pd.to_timedelta('05:30:00')
        
        print(df['time'].head())
        
        0   10:20:00
        1   10:20:00
        2   10:30:00
        3   10:42:00
        4   11:34:00
        Name: 1, dtype: timedelta64[ns]
        

        datetime系列

        df['time'] = pd.to_datetime(df['time'].astype(str)) + pd.DateOffset(hours=5, minutes=30)
        
        print(df['time'].head())
        
        0   2018-12-24 10:20:00
        1   2018-12-24 10:20:00
        2   2018-12-24 10:30:00
        3   2018-12-24 10:42:00
        4   2018-12-24 11:34:00
        Name: 1, dtype: datetime64[ns]
        

        注意默认情况下当前日期是假定的。

        【讨论】:

        • 有趣 - 这与this 答案中的方法相比如何。我们应该更喜欢pd.to_timedeltapd.DatetimeIndex 吗?
        • @Mr_and_Mrs_D,没有时间复杂度差异。它们应该大致相等。一般来说,我在创建索引时保留DatetimeIndex(因为它在名称中),在创建系列时保留to_datetime
        【解决方案4】:

        这是一种粗糙的方法,主要是这里的问题是缺乏对 time 对象的矢量化支持,因此您首先需要使用 combinetime 转换为 datetime 然后应用偏移量并取回time 组件:

        In [28]:  
        import datetime as dt  
        df['new_time'] = df['time'].apply(lambda x: (dt.datetime.combine(dt.datetime(1,1,1), x,) + dt.timedelta(hours=3,minutes=30)).time())
        df
        
        Out[28]:
                   time  new_time
        index                    
        0      04:50:00  08:20:00
        1      04:50:00  08:20:00
        2      05:00:00  08:30:00
        3      05:12:00  08:42:00
        4      06:04:00  09:34:00
        5      06:44:00  10:14:00
        6      06:44:00  10:14:00
        7      06:47:00  10:17:00
        8      06:47:00  10:17:00
        9      06:47:00  10:17:00
        

        【讨论】:

        • 上面如何选择大于上午10点的时间?
        • df[df['new_time'] > dt.time(10,0)] 为我工作或df[df.new_time.gt(dt.time(10))]
        猜你喜欢
        • 2016-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-14
        • 2020-03-15
        • 2018-10-26
        • 2023-02-09
        • 1970-01-01
        相关资源
        最近更新 更多