Python列日期时间减去日期时间

时间:2018-11-23 02:03:09

标签: python pandas datetime

了解到,在减去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]')

1 个答案:

答案 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