假设我有以下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中是否有任何可以简化此过程的功能?
答案 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
说明:
to_datetime
diff
获取cumsum
或通过sub
减去第一个值total_seconds
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