Python 以小时和分钟为单位计算两列之间的数据帧时间差
我在数据框中有两列,Python 以小时和分钟为单位计算两列之间的数据帧时间差,python,pandas,datetime,python-datetime,Python,Pandas,Datetime,Python Datetime,我在数据框中有两列,fromdate和todate 将熊猫作为pd导入 数据={'todate':[pd.时间戳('2014-01-24 13:03:12.050000')、pd.时间戳('2014-01-27 11:57:18.240000')、pd.时间戳('2014-01-23 10:07:47.660000'), “fromdate”:[pd时间戳('2014-01-26 23:41:21.870000')、pd时间戳('2014-01-27 15:38:22.540000')、pd时间
fromdate
和todate
将熊猫作为pd导入
数据={'todate':[pd.时间戳('2014-01-24 13:03:12.050000')、pd.时间戳('2014-01-27 11:57:18.240000')、pd.时间戳('2014-01-23 10:07:47.660000'),
“fromdate”:[pd时间戳('2014-01-26 23:41:21.870000')、pd时间戳('2014-01-27 15:38:22.540000')、pd时间戳('2014-01-23 18:50:41.420000')]
df=pd.DataFrame(数据)
我添加了一个新列,diff
,使用
df['diff']=df['fromdate']-df['todate']
我得到了diff
列,但它包含days
,时间超过24小时
todate fromdate diff
0 2014-01-24 13:03:12.050 2014-01-26 23:41:21.870两天10:38:09.820000
2014-01-27 11:57:18.240 2014-01-27 15:38:22.5400天03:41:04.300000
2 2014-01-23 10:07:47.660 2014-01-23 18:50:41.4200天08:42:53.760000
如何将结果仅转换为小时和分钟(即天转换为小时)?时间戳差异返回datetime.timedelta对象。通过使用*as_type*方法,可以很容易地将其转换为小时,如下所示
import pandas
df = pandas.DataFrame(columns=['to','fr','ans'])
df.to = [pandas.Timestamp('2014-01-24 13:03:12.050000'), pandas.Timestamp('2014-01-27 11:57:18.240000'), pandas.Timestamp('2014-01-23 10:07:47.660000')]
df.fr = [pandas.Timestamp('2014-01-26 23:41:21.870000'), pandas.Timestamp('2014-01-27 15:38:22.540000'), pandas.Timestamp('2014-01-23 18:50:41.420000')]
(df.fr-df.to).astype('timedelta64[h]')
屈服
0 58
1 3
2 8
dtype: float64
这让我发疯,因为上面的
.astype()
解决方案对我不起作用。但我找到了另一种方法。没有计时,但可能对其他人有用:
t1 = pd.to_datetime('1/1/2015 01:00')
t2 = pd.to_datetime('1/1/2015 03:30')
print pd.Timedelta(t2 - t1).seconds / 3600.0
…如果你想要几个小时。或:
print pd.Timedelta(t2 - t1).seconds / 60.0
…如果您需要几分钟。- 如何将结果转换为仅小时和分钟
- 接受的答案只返回
不包括分钟。天+小时
- 接受的答案只返回
- 要提供包含小时和分钟的列,如
或hh:mm
,需要额外的计算和字符串格式x小时y分钟
- 这个答案显示了如何使用
math将总小时数或总分钟数作为浮点数,并且比使用timedelta
.astype('timedelta64[h]”)更快。
- :请参阅支持的操作
- 以下示例数据已经是
。要求使用转换所有相关列datetime64[ns]数据类型
将熊猫作为pd导入
#来自OP的测试数据,其值已采用datetime格式
数据={'to_date':[pd.时间戳('2014-01-24 13:03:12.050000')、pd.时间戳('2014-01-27 11:57:18.240000')、pd.时间戳('2014-01-23 10:07:47.660000'),
“起始日期”:[pd.时间戳('2014-01-26 23:41:21.870000')、pd.时间戳('2014-01-27 15:38:22.540000')、pd.时间戳('2014-01-23 18:50:41.420000')]
#测试数据帧;列必须采用日期时间格式;如果需要,请使用pandas.to_datetime
df=pd.DataFrame(数据)
#如果需要,请添加timedelta列。此处添加此信息仅供参考
#df['time_delta_with_sub']=df.from_date.sub(df.to_date)#同样有效
df['time\u delta']=(df.from\u date-df.to\u date)
#创建一个列,将timedelta作为总小时数,作为浮动类型
df['tot_hour_diff']=(df.from_date-df.to_date)/pd.Timedelta(小时=1)
#创建一个列,将timedelta作为总分钟数,作为浮点类型
df['tot_mins_diff']=(df.from_date-df.to_date)/pd.Timedelta(分钟=1)
#显示(df)
到日期从日期时间增量到小时差异到分钟差异
0 2014-01-24 13:03:12.050 2014-01-26 23:41:21.8702天10:38:09.820000 58.636061 3518.163667
1 2014-01-27 11:57:18.240 2014-01-27 15:38:22.5400天03:41:04.300000 3.684528 221.071667
2 2014-01-23 10:07:47.660 2014-01-23 18:50:41.4200天08:42:53.760000 8.714933522.896000
其他方法
- 其他参考资料中的播客中的一条注释,
是在核心开发人员休假时添加和合并的,不会得到批准。.total_seconds()
- 这也是为什么没有其他
方法的原因.total\u xx
- 这也是为什么没有其他
#将整个时间增量转换为秒
#这与td/timedelta相同(秒=1)
(df.from_date-df.to_date).dt.总秒数()
[out]:
0 211089.82
1 13264.30
2 31373.76
数据类型:64
#获取天数
(df.from_date-df.to_date).dt.天
[out]:
0 2
1 0
2 0
数据类型:int64
#获得时+分+秒的秒数,但不是天
#请注意与总秒数的差异
(df.from_date-df.to_date).dt.秒
[out]:
0 38289
1 13264
2 31373
数据类型:int64
其他资源
-
- 时间差在31分钟开始
- 根据Python核心开发人员和维护人员的说法:
- 使用
(df.from\u date-df.to\u date)/pd.Timedelta(小时=1)
- 不要使用
(df.from_date-df.to_date).dt.total_seconds()/3600
- 使用
- 该模块提供了对标准模块的强大扩展
%%timeit
测试
将熊猫作为pd导入
#具有2M行的数据帧
数据={'to_date':[pd.Timestamp('2014-01-24 13:03:12.050000')、pd.Timestamp('2014-01-27 11:57:18.240000')、'from_date':[pd.Timestamp('2014-01-26 23:41:21.870000')、pd.Timestamp('2014-01-27 15:38:22.540000')]
df=pd.DataFrame(数据)
df=pd.concat([df]*1000000).重置索引(drop=True)
%%时间
(df.from_date-df.to_date)/pd.Timedelta(小时=1)
[out]:
每个回路43.1 ms±1.05 ms(7次运行的平均值±标准偏差,每个10个回路)
%%时间
(df.from_date-df.to_date).astype('timedelta64[h]”)
[out]:
每个回路59.8 ms±1.29 ms(7次运行的平均值±标准偏差,每个10个回路)
aType变通方法可以工作,但对于大型(50万行)文件来说速度太慢。还有其他建议吗?timedelta对象具有天和秒的属性。。。是的,(df.fr df.to).dt.days*24+(df.fr df.to).dt.seconds/3600谢谢!这对我来说很有效