我在一个 Dataframe 中有两列,fromdate
和todate
。
import pandas as pd
data = {'todate': [pd.Timestamp('2014-01-24 13:03:12.050000'), pd.Timestamp('2014-01-27 11:57:18.240000'), pd.Timestamp('2014-01-23 10:07:47.660000')],
'fromdate': [pd.Timestamp('2014-01-26 23:41:21.870000'), pd.Timestamp('2014-01-27 15:38:22.540000'), pd.Timestamp('2014-01-23 18:50:41.420000')]}
df = pd.DataFrame(data)
我添加了一个新列diff
,使用查找两个日期之间的差异
df['diff'] = df['fromdate'] - df['todate']
我得到了diff
列,但是当超过24小时时,它包含days
。
todate fromdate diff
0 2014-01-24 13:03:12.050 2014-01-26 23:41:21.870 2 days 10:38:09.820000
1 2014-01-27 11:57:18.240 2014-01-27 15:38:22.540 0 days 03:41:04.300000
2 2014-01-23 10:07:47.660 2014-01-23 18:50:41.420 0 days 08:42:53.760000
如何将结果仅转换为小时和分钟(例如,将天数转换为小时)?
4条答案
按热度按时间vawmfj5a1#
Pandas时间戳差异返回一个datetime.timedelta对象,通过使用 as_type 方法可以很容易地将其转换为小时,如下所示
为了屈服,
icnyk63a2#
这让我抓狂,因为上面的
.astype()
解决方案对我不起作用。但我找到了另一种方法。还没有计时或任何东西,但可能对其他人起作用:...如果您需要几个小时。或者:
......如果你想要几分钟的话。
**更新:**这里曾经有一个有用的评论提到使用
.total_seconds()
来处理跨越多天的时间段。kg7wmglp3#
days + hours
。不包括分钟数。hh:mm
或x hours y minutes
的列,则需要进行额外的计算和设置字符串格式。timedelta
数学方法将总小时数或总分钟数作为浮点数,这比使用.astype('timedelta64[h]')
要快。timedelta
对象:请参阅支持的操作。datetime64[ns] dtype
,需要使用pandas.to_datetime()
转换所有相关列。其他方法
.total_seconds()
是在核心开发人员休假时添加和合并的,因此不会被批准。.total_xx
方法的原因。其他资源
dateutil
维护人员的说法:(df.from_date - df.to_date) / pd.Timedelta(hours=1)
(df.from_date - df.to_date).dt.total_seconds() / 3600
pandas.Series.dt.total_seconds
.dt
存取器dateutil
模块为标准datetime
模块提供了强大的扩展。测试
ma8fv8wu4#
默认情况下,Pandas时差的分辨率为纳秒,即
timedelta64[ns]
,因此将其转换为秒/分钟/小时等的一种方法是将其纳秒表示除以10**9
以转换为秒,除以60*10**9
以转换为分钟等。此方法比本页建议的其他方法至少快3倍。1PS:上面的代码假设你想要的是整秒,整分钟,整小时的差值,所以它使用整数除法(
//
),但是如果你也想要分数,那么使用真除法(/
)。也就是说,如果你想要精确的差值,那么考虑将差值转换为更高的分辨率(毫秒/微秒/等等),而不是分数秒/分钟/小时。1一些使用Trenton McKinney's setup的基准测试: