问题背景:数据集存在2个时间变量:订单开始时间,订单结束时间(如下图)
需求:计算2个时间差值。
思路:先确认变量的数据类型,然后调试下是否有超过天的数据,没有的话就分别分割成时,分,秒。然后转化为分钟单位,
最后差值=结束时间-开始时间
对应操作如下:
1.修改时间数据类型:
df1['start_time'] = pd.to_datetime(df1.start_time)
df1['end_time'] = pd.to_datetime(df1.end_time)
2.分割时间:
提取小时有2种方式:
#方式1:df1['订单开始-小时'] = [datetime.strftime(x, '%H') for x in df1['start_time']]
#方式2:df1['订单开始_小时']=df1['start_time'].dt.hour
df1['订单开始_日']=df1['start_time'].dt.day
df1['订单结束_日']=df1['end_time'].dt.day
df1['订单开始_小时']=df1['start_time'].dt.hour
df1['订单结束_小时']=df1['end_time'].dt.hour
df1['订单开始_分钟']=df1['start_time'].dt.minute
df1['订单结束_分钟']=df1['end_time'].dt.minute
df1['订单开始_秒']=df1['start_time'].dt.second
df1['订单结束_秒']=df1['end_time'].dt.second
3.计算差值
df1['使用分钟'] = (df1.订单结束_日 - df1.订单开始_日)*24*60 + (df1.订单结束_小时 - df1.订单开始_小时)*60 + (df1.订单结束_分钟 - df1.订单开始_分钟)+(df1.订单结束_秒 - df1.订单开始_秒)/60
df1.head(5)
但是,虽然逻辑上没有问题,实际数据会有问题,假如有跨本月底和下个月初交接,8.31号和9.1号,就会出现差值为负。
最好是如下操作(未名大神指点的):
pandas 对于 datetime 类型的数据,可以直接相减获得 Timedelta 数据,类似于表示时间段的数据类型,这类数据可以直接使用 .dt.seconds
获得这段时间对应的秒数,注意是 seconds
不是 second
,多了一个 s
,所以要获得订单使用的时间,可以直接这样写:
df1['duration_min'] = (df1['end_time'] - df1['start_time']).dt.seconds/60
df1['duration_min'] = (df1['end_time'] - df1['start_time']).dt.seconds/60