df如下所示:
Time A
2019-05-18 01:15:28 7
2019-05-18 01:28:11 7
2019-05-18 01:36:36 12
2019-05-18 01:39:47 12
2019-05-18 01:53:32 12
2019-05-18 02:05:37 7
我了解如何计算连续的行时差。但是我想计算A中的值为7到12的时间差。
预期输出:
Time A Time_difference
2019-05-18 01:15:28 7 0
2019-05-18 01:28:11 7 0
2019-05-18 01:36:36 12 00:21:08
2019-05-18 01:39:47 12 0
2019-05-18 01:53:32 12 0
2019-05-18 02:05:37 12 0
答案 0 :(得分:2)
您可以使用loc
隔离数据框中的任何值。返回的是一个Series,可以像列表一样对其进行索引。使用[0]
获取系列中的第一个匹配项。
times = [
'2019-05-18 01:15:28',
'2019-05-18 01:28:11',
'2019-05-18 01:36:36',
'2019-05-18 01:39:47',
'2019-05-18 01:53:32',
'2019-05-18 02:05:37'
]
a = [9, 7, 7, 5, 12, 12]
df = pd.DataFrame({'times':times, 'a':a})
df.times = pd.to_datetime(df['times'])
pd.Timedelta(df.loc[df.a == 12, 'times'].values[0] - df.loc[df.a == 7, 'times'].values[0])
Timedelta('0 days 00:25:21')
或者出于可读性考虑,我们可以将该代码拆开,然后对新变量进行计算:
times = [
'2019-05-18 01:15:28',
'2019-05-18 01:28:11',
'2019-05-18 01:36:36',
'2019-05-18 01:39:47',
'2019-05-18 01:53:32',
'2019-05-18 02:05:37'
]
a = [9, 7, 7, 5, 12, 12]
df = pd.DataFrame({'times':times, 'a':a})
df.times = pd.to_datetime(df['times'])
end = df.loc[df.a == 12, 'times'].values[0]
start = df.loc[df.a == 7, 'times'].values[0]
pd.Timedelta(end - start)
Timedelta('0 days 00:25:21')
答案 1 :(得分:1)
示例:
times = [
'2019-05-18 01:15:28',
'2019-05-18 01:28:11',
'2019-05-18 01:36:36',
'2019-05-18 01:39:47',
'2019-05-18 01:53:32',
'2019-05-18 02:05:37'
]
a = [7, 7, 12, 7, 12, 7]
df = pd.DataFrame({'times': pd.to_datetime(times), 'A':a})
print (df)
times A
0 2019-05-18 01:15:28 7
1 2019-05-18 01:28:11 7
2 2019-05-18 01:36:36 12
3 2019-05-18 01:39:47 7
4 2019-05-18 01:53:32 12
5 2019-05-18 02:05:37 7
首先创建默认索引,并仅使用7
和12
过滤行:
df = df.reset_index(drop=True)
df1 = df[df['A'].isin([7, 12])]
然后获得行中的第一个连续值,并与移位后的值进行比较:
df1 = df1[df1['A'].ne(df1['A'].shift())]
print (df1)
times A
0 2019-05-18 01:15:28 7
2 2019-05-18 01:36:36 12
3 2019-05-18 01:39:47 7
4 2019-05-18 01:53:32 12
5 2019-05-18 02:05:37 7
然后过滤7
和另外12
行:
m1 = df1['A'].eq(7) & df1['A'].shift(-1).eq(12)
m2 = df1['A'].eq(12) & df1['A'].shift().eq(7)
df2 = df1[m1 | m2]
print (df2)
times A
0 2019-05-18 01:15:28 7
2 2019-05-18 01:36:36 12
3 2019-05-18 01:39:47 7
4 2019-05-18 01:53:32 12
获取具有配对和取消配对行的日期时间:
out7 = df2.iloc[::2]
out12 = df2.iloc[1::2]
最后减去:
df['Time_difference'] = out12['times'] - out7['times'].to_numpy()
df['Time_difference'] = df['Time_difference'].fillna(pd.Timedelta(0))
print (df)
times A Time_difference
0 2019-05-18 01:15:28 7 00:00:00
1 2019-05-18 01:28:11 7 00:00:00
2 2019-05-18 01:36:36 12 00:21:08
3 2019-05-18 01:39:47 7 00:00:00
4 2019-05-18 01:53:32 12 00:13:45
5 2019-05-18 02:05:37 7 00:00:00
答案 2 :(得分:1)
说明:
import pandas as pd
import numpy as np
np.random.seed(10)
date_range = pd.date_range("25-9-2019", "27-9-2019", freq="3H")
df = pd.DataFrame({'Time':date_range, 'A':np.random.choice([5,7,12], len(date_range))})
df["Seven"] = (df["A"] == 7).cumsum()
# display(df)
pass_to_next_group = {"val": None}
def diff(group):
group["Diff"]=0
loc = group.index[group["A"]==12]
time_a = pass_to_next_group["val"] if pass_to_next_group["val"] else group["Time"].iloc[0]
pass_to_next_group["val"] = None
if group.name>0 and len(loc)>0:
group.loc[loc[0],"Diff"] = time_a-group.loc[loc[0],"Time"]
else:
pass_to_next_group["val"] = time_a
return group
df.groupby("Seven").apply(diff)