【问题标题】:Convert timedelta64[ns] column to seconds in Python Pandas DataFrame在 Python Pandas DataFrame 中将 timedelta64[ns] 列转换为秒
【发布时间】:2014-12-14 21:56:55
【问题描述】:

如图所示,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]]

【问题讨论】:

  • 这是已修复的最新版本;与source code 一样,如果两边都是timedelta 加法,则支持减法和除法。该部分代码在 2013 年被更改
  • @behzad.nouri 是对的,我相信这是在 > 0.13.1 中修复的(可能需要 0.14),但当前是 0.15.0:pandas.pydata.org/pandas-docs/stable/…
  • @behzad.nouri 谢谢,更新到 Pandas 0.15.0 和 numpy 1.9.0 让它工作。

标签: python python-2.7 numpy pandas


【解决方案1】:

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

timedelta64 和 datetime64 数据在内部存储为 8 字节整数(dtype '&lt;i8')。所以上面将 timedelta64s 视为 8 字节整数,然后执行整数 除法将纳秒转换为秒。

请注意,您 need NumPy version 1.7 or newer 使用 datetime64/timedelta64s。

【讨论】:

    【解决方案2】:

    使用Series dt accessor 访问日期时间(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
    

    还有其他用于字符串、分类和稀疏数据类型的 Pandas Series Accessors

    【讨论】:

    • 这个。它比其他答案中的语法清晰一千倍。
    【解决方案3】:

    刚刚意识到这是一个旧线程,无论如何,如果流浪者将它留在这里 像我一样只点击搜索引擎上的前 5 个结果并结束 在这里。

    确保您的类型正确。

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

        • 小时 - 小时 x 3600 = 秒
        • 分钟 - 分钟 x 60 = 秒
        • 秒 - 秒

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

    • 如果您想将 timedelta 转换为 seconds,请使用下面的方法。

    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] 格式,它是 startend 日期时间值的减法。

    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 秒的所有持续时间。

    希望对您有所帮助。

    【讨论】:

    • 谢谢 :) 今天拯救了我的一天
    【解决方案4】:

    使用“total_seconds()”函数:

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

    【讨论】:

      【解决方案5】:

      我们可以简单地使用 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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-15
        • 1970-01-01
        • 2019-01-02
        • 2020-04-28
        • 2020-11-05
        • 1970-01-01
        相关资源
        最近更新 更多