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分钟
    ,需要额外的计算和字符串格式
  • 这个答案显示了如何使用
    timedelta
    math将总小时数或总分钟数作为浮点数,并且比使用
    .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谢谢!这对我来说很有效