我有以下熊猫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上切片它,检测适当的行呢?
答案 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
的val1df = 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