如何根据条件查找列中各行之间的日期时间差?

时间:2019-04-11 22:28:55

标签: python pandas

我有以下熊猫DataFrame df

date        time       val1
2018-12-31  09:00:00   15
2018-12-31  10:00:00   22
2018-12-31  11:00:00   19
2018-12-31  11:30:00   10
2018-12-31  11:45:00   5
2018-12-31  12:00:00   1
2018-12-31  12:05:00   6

我想知道val1值大于20和val1值小于或等于5之间有多少分钟?

在此示例中,答案是1小时45分钟= 95分钟。

我知道如何检查两个日期时间值之间的差异:

(df.from_datetime-df.to_datetime).astype('timedelta64[m]')

但是如何在DataFrame上切片它,检测适当的行呢?

2 个答案:

答案 0 :(得分:1)

更新:考虑到日期可能有所不同

将日期列转换为datetime对象,将时间列转换为timedelta对象,并将它们组合以得到另一个datetime对象

df.time = pd.to_timedelta(df.time)
df.date = pd.to_datetime(df.date)
df['date_time'] = df['date'] + df['time']

df

          date      time    val1              date_time
0   2018-12-31  09:00:00      15    2018-12-31 09:00:00
1   2018-12-31  10:00:00      22    2018-12-31 10:00:00
2   2018-12-31  11:00:00      19    2018-12-31 11:00:00
3   2018-12-31  11:30:00      10    2018-12-31 11:30:00
4   2018-12-31  11:45:00       5    2018-12-31 11:45:00
5   2018-12-31  12:00:00       1    2018-12-31 12:00:00
6   2018-12-31  12:05:00       6    2018-12-31 12:05:00

现在可以使用这两种方法之一

1)喜欢lambda,这适用于Series对象。

subtr = lambda d1, d2: abs(d1 - d2)/np.timedelta64(1, 'm')

d20 = df[df.val1 > 20].date_time.iloc[0]
d5 = df[df.val1 <= 5].date_time.iloc[0]
subtr(d20, d5)

105.0

2)需要DataFrame对象而不是Series对象。妨碍我的审美观

d20 = df[df.val1 <= 5][['date_time']].iloc[0]
d5 = df[df.val1 > 20][['date_time']].iloc[0]

abs(d5 - d20).astype('timedelta64[m]')[0]

105.0

答案 1 :(得分:0)

这是我的方法:

1)过滤掉所有不等于> = 20或<= 5

的val1
df = pd.DataFrame({'date':['2018-12-31','2018-12-31','2018-12-31','2018-12-31','2018-12-31','2018-12-31','2018-12-31'],
                  'time':['09:00:00', '10:00:00', '11:00:00', '11:30:00', '11:45:00', '12:00:00', '12:05:00'],
                  'val1': [15,22,19,10,5,1,6]})

df2 = df[(df['val1'] >= 20)|(df['val1'] <= 5)].copy()

然后我们将执行以下代码:

df2['TimeDiff'] = np.where(df2['val1'] - df2['val1'].shift(-1) >= 15, 
                           df2['time'].astype('datetime64[ns]').shift(-1) - df2['time'].astype('datetime64[ns]'), 
                           np.NaN)

让我经历一下。

np.where是一个if语句,如果第一个语句为true,它将执行第二个语句;如果不是,则执行第三个语句。

df2['val1'] - df2['val1'].shift(-1) >= 15由于我们过滤了df,因此两行之间的最小差必须大于或等于15。

如果是这样:

df2['time'].astype('datetime64[ns]').shift(-1) - df2['time'].astype('datetime64[ns]')我们花了较晚的时间,并将其从开始的时间中减去。

如果不是真的,我们只返回np.NaN

我们得到一个如下所示的df:

       date       time     val1   TimeDiff
1   2018-12-31  10:00:00    22    01:45:00
4   2018-12-31  11:45:00     5      NaT
5   2018-12-31  12:00:00     1      NaT

如果要将TimeDiff放在结束时间,则可以执行以下操作:

df2['TimeDiff'] = np.where(df2['val1'] - df2['val1'].shift(1) <= -15, 
                           df2['time'].astype('datetime64[ns]') - df2['time'].astype('datetime64[ns]').shift(), 
                           np.NaN)

您将获得:

       date        time    val1   TimeDiff
1   2018-12-31  10:00:00    22      NaT
4   2018-12-31  11:45:00     5    01:45:00
5   2018-12-31  12:00:00     1      NaT