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

e5nqia27  于 2023-10-19  发布在  Python
关注(0)|答案(6)|浏览(181)

pandas DataFrame列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]]
fnx2tebb

fnx2tebb1#

使用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

对于String、Categorical和Sparse数据类型,还有其他Pandas系列访问器。

jchrr9hc

jchrr9hc2#

这在当前版本的Pandas(版本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

以下是旧版本Pandas/NumPy的解决方案:

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

timedelta 64和datetime 64数据在内部存储为8字节整数(dtype '<i8')。因此,上面的代码将timedelta 64视为8字节整数,然后进行整数除法将纳秒转换为秒。
请注意,您需要NumPy版本1.7或更高版本才能使用datetime 64/timedelta 64 s。

w1jd8yoj

w1jd8yoj3#

刚刚意识到这是一个老线程,无论如何,如果像我这样的流浪者只点击搜索引擎上的前5名结果,并在这里结束,就把它留在这里。
确保你的类型是正确的。

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

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

  • 如果你想转换timedelta使用下面的一个。

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]

我的持续时间是timedelta 64 [ns]格式的,它是startenddatetime值的减法。

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]

使用pandas,我将两个日期之间的持续时间设置为浮点数。更容易比较或过滤您的持续时间。

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秒。

flmtquvp

flmtquvp4#

使用'total_seconds()'函数:

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

4smxwvx55#

我们可以简单地使用pandas**apply()**函数

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)
vaqhlq81

vaqhlq816#

答案并不适合年龄。这里有一个更简单的解决方案:
df.duration.dt.total_seconds()

相关问题