【发布时间】:2018-08-28 21:59:36
【问题描述】:
我的 pandas 数据框中有两个日期时间列;我怎样才能找到以小时为单位的差异(数字)?
例如从 2018-07-30 19:03:04 至 2018-07-31 11:00:48 是 15.962 小时。 当我减去两列时,我得到 15:57:43.430000,这是不希望的。
【问题讨论】:
-
请发布可重现的代码/数据。
我的 pandas 数据框中有两个日期时间列;我怎样才能找到以小时为单位的差异(数字)?
例如从 2018-07-30 19:03:04 至 2018-07-31 11:00:48 是 15.962 小时。 当我减去两列时,我得到 15:57:43.430000,这是不希望的。
【问题讨论】:
从timedelta 中取出几秒钟,然后将其除以60*60。
除以 60 Seconds -> 1 Minute 和 60 Minutes -> 1 Hour 所以输出将以小时数为单位。
代码:
t1 = pd.to_datetime('2018-07-30 19:03:04')
t2 = pd.to_datetime('2018-07-31 11:00:48')
(t2-t1).seconds/(60*60)
15.962222222222222
当您减去它们时,您将获得 timedelta 表示的默认视图,其中首先显示天,然后显示小时,然后是分钟、秒和微秒。那就是你得到的15:57:44 值。
t2-t1
Timedelta('0 days 15:57:44')
15:57:44 的值被四舍五入,因为 t1 和 t2 在问题中没有微秒。
要在series 上使用此概念,您需要使用apply 方法,如下所示。
DateTime 列已生成并打乱。
代码:
dates = pd.date_range('2018-08-23 02:34:54','2018-08-24 00:00:00',periods=22).values
np.random.shuffle(dates)
df = pd.DataFrame(dates.reshape(11,2),columns=['t1','t2'])
df
t1 t2
0 2018-08-23 21:57:36.571428608 2018-08-23 08:42:04.285714176
1 2018-08-23 07:40:52.571428608 2018-08-23 22:58:48.285714176
2 2018-08-23 16:51:38.000000000 2018-08-23 11:45:39.428571392
3 2018-08-24 00:00:00.000000000 2018-08-23 04:37:17.428571392
4 2018-08-23 10:44:27.714285824 2018-08-23 12:46:51.142857216
5 2018-08-23 06:39:40.857142784 2018-08-23 13:48:02.857142784
6 2018-08-23 15:50:26.285714176 2018-08-23 03:36:05.714285824
7 2018-08-23 02:34:54.000000000 2018-08-23 09:43:16.000000000
8 2018-08-23 05:38:29.142857216 2018-08-23 18:54:01.428571392
9 2018-08-23 14:49:14.571428608 2018-08-23 19:55:13.142857216
10 2018-08-23 20:56:24.857142784 2018-08-23 17:52:49.714285824
(df['t1']-df['t2']).apply(lambda x: x.seconds/(60*60))
0 13.258889
1 8.701111
2 5.099444
3 19.378333
4 21.960000
5 16.860556
6 12.238889
7 16.860556
8 10.740833
9 18.900278
10 3.059722
dtype: float64
更新: 比上面更快的方法:
(df['t1']-df['t2'])/np.timedelta64(1,'h')
【讨论】: