首页 > 解决方案 > 如何从 pandas 中的 m8[ns] 对象中获取小时数?

问题描述

我有一个如下所示的数据框

df = pd.DataFrame({'time':['2166-01-09 14:00:00','2166-01-09 14:08:00','2166-01-09 16:00:00','2166-01-09 20:00:00',
                       '2166-01-09 04:00:00','2166-01-10 05:00:00','2166-01-10 06:00:00','2166-01-10 07:00:00','2166-01-10 11:00:00',
                       '2166-01-10 11:30:00','2166-01-10 12:00:00','2166-01-10 13:00:00','2166-01-10 13:30:00']})

我试图找到行之间的时间差。为此我做了以下

df['time2'] = df['time'].shift(-1)
df['tdiff'] = (df['time2'] - df['time'])

所以,我的结果如下所示

在此处输入图像描述

我发现存在类似的功能dt.days,我尝试了

df['tdiff'].dt.days

但它只提供白天组件,但我正在寻找类似“小时”组件的东西

但是,我希望我的输出如下所示

在此处输入图像描述

很抱歉,我不确定如何计算第 3 行中负时间的小时数。可能是数据问题。

标签: pythonpython-3.xpandasdataframedatetime

解决方案


在 pandas 中,可以将 timedeltas 转换为秒Series.dt.total_seconds,然后除以3600

df['tdiff'] = (df['time2'] - df['time']).dt.total_seconds() / 3600
print (df)
                  time               time2      tdiff
0  2166-01-09 14:00:00 2166-01-09 14:08:00   0.133333
1  2166-01-09 14:08:00 2166-01-09 16:00:00   1.866667
2  2166-01-09 16:00:00 2166-01-09 20:00:00   4.000000
3  2166-01-09 20:00:00 2166-01-09 04:00:00 -16.000000
4  2166-01-09 04:00:00 2166-01-10 05:00:00  25.000000
5  2166-01-10 05:00:00 2166-01-10 06:00:00   1.000000
6  2166-01-10 06:00:00 2166-01-10 07:00:00   1.000000
7  2166-01-10 07:00:00 2166-01-10 11:00:00   4.000000
8  2166-01-10 11:00:00 2166-01-10 11:30:00   0.500000
9  2166-01-10 11:30:00 2166-01-10 12:00:00   0.500000
10 2166-01-10 12:00:00 2166-01-10 13:00:00   1.000000
11 2166-01-10 13:00:00 2166-01-10 13:30:00   0.500000
12 2166-01-10 13:30:00                 NaT        NaN

推荐阅读