假设我有以下Pandas DataFrame。我想计算自上次观察每个ip
以来的时间(以秒为单位)。请注意,数据不一定是有序的。
dict = {'ip':[123, 326, 123, 326], 'hour': [14, 12, 12, 1], 'minute': [54, 23, 41, 8], 'second': [45, 29, 19, 33]}
df = pd.DataFrame(dict, columns = dict.keys())
ip hour minute second
0 123 14 54 45
1 326 12 23 29
2 123 12 41 19
3 326 1 8 33
例如,我想在第一个条目中添加一个列,表示当第二次捕获ip
123时,等效时间为(14:54:45 - 12:41:19) )自数据集中的最后一次出现以来已经过去了。
我正在尝试使用groupby
,但没有成功。有什么想法吗?
提前致谢!!!
答案 0 :(得分:1)
您可以使用to_datetime
,然后我们groupby
将您的小时,分钟,秒列转换为日期时间,然后获取不同的diff
df['Time']=pd.to_datetime(df.iloc[:,1:].astype(str).apply(''.join,1),format='%H%M%S')
df['Yourneed']=df.groupby('ip').Time.diff().dt.total_seconds()
df
ip hour minute second Time Yourneed
0 123 14 54 45 1900-01-01 14:54:45 NaN
1 326 12 23 29 1900-01-01 12:23:29 NaN
2 123 12 41 19 1900-01-01 12:41:19 -8006.0
3 326 1 8 33 1900-01-01 18:03:03 20374.0
答案 1 :(得分:0)
你和groupby很亲密。创建一个合适的datetime列可能是缺失的部分:
from datetime import datetime
import pandas
def row_to_date(row):
today = datetime.today()
return datetime(
today.year,
today.month,
today.day,
row['hour'],
row['minute'],
row['second']
)
data = {
'ip':[123, 326, 123, 326],
'hour': [14, 12, 12, 1],
'minute': [54, 23, 41, 8],
'second': [45, 29, 19, 33]
}
df = (
pandas.DataFrame(data)
.assign(date=lambda df: df.apply(row_to_date, axis=1))
.groupby(by=['ip'])
.apply(lambda g: g.diff()['date'].dt.total_seconds())
.dropna()
.to_frame('elapsed_seconds')
.reset_index(level=1, drop=True)
)
df
所以我得到了:
elapsed_seconds
ip
123 -8006.0
326 -40496.0