了解到,在减去pandas列时还有很多类似的问题,但是我的情况很独特
我有2组数据,都包含日期时间。我的程序要求我匹配这2个日期时间,因此我使用了merge_asof来匹配最接近的时间。匹配数据后,我需要找到这两组数据之间的时间差。
EndTime,Datetime
3/10/2010 0:00:33, 3/10/2010 0:00:26
3/10/2010 0:01:15,
3/10/2010 0:01:30,
3/10/2010 0:02:09, 3/10/2010 0:01:36
3/10/2010 0:02:50,
3/10/2010 0:05:09,
3/10/2010 0:06:00, 3/10/2010 0:05:48
唯一部分将是我想使用Datetime减去结束时间之前的1行,(例如最后一行 2010年3月10日0:05:48- 倒数第二行 2010/3/10 0:05:09 = 39seconds
预期结果将是:
EndTime,Datetime,SecondsDiff
3/10/2010 0:00:33, 3/10/2010 0:00:26, *not sure how to compute this but not important for 1st row of data*
3/10/2010 0:01:15,,
3/10/2010 0:01:30,,
3/10/2010 0:02:09, 3/10/2010 0:01:36,6
3/10/2010 0:02:50,,
3/10/2010 0:05:09,,
3/10/2010 0:06:00, 3/10/2010 0:05:48,39
我尝试了一些导致错误的方法,请提出建议!
当我匹配数据时,它会导致重复,所以我使用
dm.loc[(dm['Datetime'].notnull())&(dm.duplicated('Datetime')==True),'Datetime'] = ' '
提供不会导致重复的空白空间,但会给我“在位置1处解析日期时间字符串“”时出现错误
-
我也尝试将重复项指示为0并转换datetime类型,但导致
error ufunc subtract cannot use operands with types dtype('O') anddtype('<M8[ns]')
,因此我尝试了以下方法,但是导致我的datetime列变为仅日期,并且秒差完全消失了
dm.loc[(dm['Datetime'].notnull())&(dm.duplicated('Datetime')==True),'Datetime'] = 0
dm['EndTime'] = dm['EndTime'].values.astype('datetime64')
dm['Datetime'] = dm['Datetime'].values.astype('datetime64')
dm['Seconds'] = (dm.Datetime -
dm.EndTime.shift(-1)).astype('timedelta64[s]')
答案 0 :(得分:0)
您可以使用IIUC:
print (df)
EndTime Datetime
0 3/10/2010 0:00:33 3/10/2010 0:00:26
1 3/10/2010 0:01:15
2 3/10/2010 0:01:30 NaN
3 3/10/2010 0:02:09 3/10/2010 0:01:36
4 3/10/2010 0:02:50 NaN
5 3/10/2010 0:05:09 NaN
6 3/10/2010 0:06:00 3/10/2010 0:05:48
df.Datetime = pd.to_datetime(df.Datetime, errors='coerce')
df.EndTime = pd.to_datetime(df.EndTime, errors='coerce')
df['SecondsDiff'] = df.Datetime.sub(df.EndTime.shift()).dt.seconds
print (df)
EndTime Datetime SecondsDiff
0 2010-03-10 00:00:33 2010-03-10 00:00:26 NaN
1 2010-03-10 00:01:15 NaT NaN
2 2010-03-10 00:01:30 NaT NaN
3 2010-03-10 00:02:09 2010-03-10 00:01:36 6.0
4 2010-03-10 00:02:50 NaT NaN
5 2010-03-10 00:05:09 NaT NaN
6 2010-03-10 00:06:00 2010-03-10 00:05:48 39.0