在 Python Panda DataFrame 中将 timedelta64[ ns ]列转换为秒

熊猫数据框列 duration包含如图所示的 timedelta64[ns]。如何将它们转换为秒?

0   00:20:32
1   00:23:10
2   00:24:55
3   00:13:17
4   00:18:52
Name: duration, dtype: timedelta64[ns]

我试过以下方法

print df[:5]['duration'] / np.timedelta64(1, 's')

但是发现了错误

Traceback (most recent call last):
File "test.py", line 16, in <module>
print df[0:5]['duration'] / np.timedelta64(1, 's')
File "C:\Python27\lib\site-packages\pandas\core\series.py", line 130, in wrapper
"addition and subtraction, but the operator [%s] was passed" % name)
TypeError: can only operate on a timedeltas for addition and subtraction, but the operator [__div__] was passed

也试过了

print df[:5]['duration'].astype('timedelta64[s]')

但是收到了错误

Traceback (most recent call last):
File "test.py", line 17, in <module>
print df[:5]['duration'].astype('timedelta64[s]')
File "C:\Python27\lib\site-packages\pandas\core\series.py", line 934, in astype
values = com._astype_nansafe(self.values, dtype)
File "C:\Python27\lib\site-packages\pandas\core\common.py", line 1653, in _astype_nansafe
raise TypeError("cannot astype a timedelta from [%s] to [%s]" % (arr.dtype,dtype))
TypeError: cannot astype a timedelta from [timedelta64[ns]] to [timedelta64[s]]
116435 次浏览

这在现有的熊猫版本(0.14版本)中可以正常工作:

In [132]: df[:5]['duration'] / np.timedelta64(1, 's')
Out[132]:
0    1232
1    1390
2    1495
3     797
4    1132
Name: duration, dtype: float64

这里有一个老版本的熊猫/NumPy 的解决方案:

In [131]: df[:5]['duration'].values.view('<i8')/10**9
Out[131]: array([1232, 1390, 1495,  797, 1132], dtype=int64)

Timedelta64和 datetime64数据在内部存储为8字节 int (dtype 因此,上面的代码将 timedelta64s 视为8字节整数,然后执行整数 将纳秒转换为秒。

请注意,需要 NumPy 版本1.7或更新使用 datetime64/timedelta64。

只是意识到这是一个老线程,无论如何离开这里,如果流浪者 像我这样的人只点击搜索引擎上排名前五的搜索结果 给你。

确保你的类型是正确的。

  • 如果要将 日期时间转换为 几秒钟,只需将 datetime 对象的每个小时、分钟和秒的秒数相加,如果它的持续时间在一个日期内。

      • 小时-小时 x3600 = 秒
      • 分钟-分钟 x 60 = 秒
      • 几秒,几秒

linear_df['duration'].dt.hour*3600 + linear_df['duration'].dt.minute*60 + linear_df['duration'].dt.second

  • 如果要将 时间三角洲转换为 几秒钟,请使用下面的一个。

linear_df[:5]['duration'].astype('timedelta64[s]')

我让它这样工作:

Start _ dt 和 end _ dt 列的格式如下:

import datetime


linear_df[:5]['start_dt']


0   1970-02-22 21:32:48.000
1   2016-12-30 17:47:33.216
2   2016-12-31 09:33:27.931
3   2016-12-31 09:52:53.486
4   2016-12-31 10:29:44.611
Name: start_dt, dtype: datetime64[ns]

持续时间为 timedelta64[ ns ]格式,即减去 开始结束日期时间值。

linear_df['duration'] = linear_df['end_dt'] - linear_df['start_dt']

结果的持续时间列如下所示

linear_df[:5]['duration']


0          0 days 00:00:14
1   2 days 17:44:50.558000
2   0 days 15:37:28.418000
3   0 days 18:45:45.727000
4   0 days 19:21:27.159000
Name: duration, dtype: timedelta64[ns]

使用熊猫我有我的持续时间之间的两个日期浮动秒。更容易比较或过滤你的持续时间后。

linear_df[:5]['duration'].astype('timedelta64[s]')


0        14.0
1    236690.0
2     56248.0
3     67545.0
4     69687.0
Name: duration, dtype: float64

在我的例子中,如果我想得到所有的持续时间都超过1秒。

希望能有帮助。

我们可以简单地使用熊猫 申请()函数

def get_seconds(time_delta):
return time_delta.seconds


def get_microseconds(time_delta):
return time_delta.micro_seconds


time_delta_series = df['duration']


converted_series = time_delta_series.apply(get_seconds)
print(converted_series)

使用 Dt 系列访问器访问 datetime (timedelta)系列的方法和属性。

>>> s
0   -1 days +23:45:14.304000
1   -1 days +23:46:57.132000
2   -1 days +23:49:25.913000
3   -1 days +23:59:48.913000
4            00:00:00.820000
dtype: timedelta64[ns]
>>>
>>> s.dt.total_seconds()
0   -885.696
1   -782.868
2   -634.087
3    -11.087
4      0.820
dtype: float64

对于字符串、分类和稀疏数据类型,还有其他熊猫 系列存取器

使用‘ total _ second ()’函数:

df['durationSeconds'] = df['duration'].dt.total_seconds()

答案并没有随着时间的推移而变化,这里有一个更简单的解决方案:

df.duration.dt.total_seconds()