计算pandas datetime列的累积持续时间

时间:2018-04-16 08:57:39

标签: python pandas

假设我有以下pandas dataframe

df = pd.DataFrame ({'time': ['2014-05-01 18:47:05', '2014-05-01 18:47:06', '2014-05-02 18:47:08', '2014-05-02 18:47:10', '2014-05-02 18:47:11']})
df['time'] = pd.to_datetime(df['time'])

这给出了以下数据框

              time
0 2014-05-01 18:47:05
1 2014-05-01 18:47:06
2 2014-05-02 18:47:08
3 2014-05-02 18:47:10
4 2014-05-02 18:47:11

我想添加另一列,以秒为单位计算时间列的持续时间,如下所示

    time                   duration
0 2014-05-01 18:47:05          0
1 2014-05-01 18:47:06          1 
2 2014-05-02 18:47:08          3 
3 2014-05-02 18:47:10          5
4 2014-05-02 18:47:11          6

显然,我可以做一些循环并手动改变,但我怀疑这不是一种pythonic方式。 pandas中是否有任何可以简化此过程的功能?

3 个答案:

答案 0 :(得分:3)

这将获得以秒为单位的总差异(即计算日期差异):

df['duration'] = pd.to_timedelta(
                     df['time'] - df['time'][0]
                   ).astype('timedelta64[s]')

答案 1 :(得分:2)

使用:

df['duration'] = (pd.to_datetime(df['time'].dt.strftime('%H:%M:%S'))
                    .diff()
                    .fillna(0)
                    .dt.total_seconds()
                    .astype(int)
                    .cumsum()
                 )

替代解决方案:

a = pd.to_datetime(df['time'].dt.strftime('%H:%M:%S'))
df['duration'] = a.sub(a.iloc[0]).dt.total_seconds().astype(int)
print (df)
                 time  duration
0 2014-05-01 18:47:05         0
1 2014-05-01 18:47:06         1
2 2014-05-02 18:47:08         3
3 2014-05-02 18:47:10         5
4 2014-05-02 18:47:11         6

说明:

  1. 首先转换具有相同日期的值to_datetime
  2. 通过diff获取cumsum或通过sub减去第一个值
  3. 最后由total_seconds
  4. 转换为seconds

答案 2 :(得分:1)

您可以取消系列中第一次输入并转换为秒:

module Jekyll
  class CreatePicTag < Liquid::Tag
    def initialize(tag_name, text, tokens)
      super
      parse(text)
    end

    def parse(text)
      pattern = /(?<=\[).+?(?=\])/
      @class = text.scan(pattern)[0]
      @alt = text.scan(pattern)[1]
      @path = text.scan(pattern)[2]
    end
  end
end