Skip to content

Python Pandas: How to Convert timedelta64[ns] Column to Total Seconds

Learn how to convert a Pandas DataFrame column containing timedelta64[ns] values into total seconds using Series.dt.total_seconds() or division by np.timedelta64(1, 's').

Pandas uses the timedelta64[ns] data type to represent durations or differences between two datetime objects. While this is useful for precise time arithmetic, you often need to express these durations in a more common unit, like total seconds, for reporting, calculations, or feature engineering.

This guide explains how to convert a Pandas DataFrame column of timedelta64[ns] objects into its equivalent in total seconds, primarily using Series.dt.total_seconds() and an alternative division method.

Understanding timedelta64[ns] in Pandas

A timedelta64[ns] object in Pandas represents a duration. The [ns] indicates that the duration is stored with nanosecond precision. For example, a timedelta could represent "2 days, 5 hours, 30 minutes" or "7500 seconds." Our goal is to convert such durations purely into their total second representation (e.g., 1 minute = 60 seconds, 1 hour = 3600 seconds).

Example DataFrame with a Timedelta Column

import pandas as pd
import numpy as np  # For np.timedelta64

data = {
    'TaskID': [1, 2, 3, 4, 5],
    'TaskName': ['Analysis', 'Development', 'Testing', 'Deployment', 'Meeting'],
    'Duration': [
        np.timedelta64(2, 'h'),                # 2 hours
        pd.Timedelta(days=1, hours=4),         # 1 day, 4 hours
        pd.Timedelta(minutes=90),              # 90 minutes
        np.timedelta64(3600 * 3 + 300, 's'),   # 3 hours 5 minutes in seconds
        pd.NaT                                 # A missing timedelta
    ]
}
df = pd.DataFrame(data)
print("Original DataFrame:")
print(df)
print()

print("Dtype of 'Duration' column:")
print(df['Duration'].dtype)

Output:

Original DataFrame:
   TaskID     TaskName        Duration
0       1     Analysis 0 days 02:00:00
1       2  Development 1 days 04:00:00
2       3      Testing 0 days 01:30:00
3       4   Deployment 0 days 03:05:00
4       5      Meeting             NaT

Dtype of 'Duration' column:
timedelta64[ns]

The 'Duration' column is of timedelta64[ns] type.

Once a column is of timedelta64[ns] type, you can use the .dt accessor to access timedelta-like properties and methods. The Series.dt.total_seconds() method returns the total duration of each timedelta in the Series, expressed in seconds, as a float.

Basic Conversion

import pandas as pd
import numpy as np

df_example = pd.DataFrame({
    'Duration': [np.timedelta64(2, 'h'), pd.Timedelta(days=1, hours=4), pd.NaT]
})

duration_in_seconds = df_example['Duration'].dt.total_seconds()

print("'Duration' column converted to total seconds:")
print(duration_in_seconds)

Output:

'Duration' column converted to total seconds:
0      7200.0
1    100800.0
2         NaN
Name: Duration, dtype: float64
  • This method correctly calculates the total number of seconds, considering all components of the timedelta (days, hours, minutes, seconds, etc.).
  • NaT (Not a Time) values in the original timedelta column are converted to NaN (Not a Number) in the resulting float Series.

Updating the Column In-Place or Creating a New Column

You can either overwrite the original 'Duration' column or create a new column for the seconds.

  • Overwrite existing column:

    import pandas as pd
    
    data = {
        'TaskID': [1, 2, 3, 4, 5],
        'TaskName': ['Analysis', 'Development', 'Testing', 'Deployment', 'Meeting'],
        'Duration': [
            np.timedelta64(2, 'h'),                # 2 hours
            pd.Timedelta(days=1, hours=4),         # 1 day, 4 hours
            pd.Timedelta(minutes=90),              # 90 minutes
            np.timedelta64(3600 * 3 + 300, 's'),   # 3 hours 5 minutes in seconds
            pd.NaT                                 # A missing timedelta
        ]
    }
    df = pd.DataFrame(data)
    
    df_update = df.copy()
    df_update['Duration'] = df_update['Duration'].dt.total_seconds()
    print("DataFrame with 'Duration' column updated to seconds:")
    print(df_update)

    Output:

    DataFrame with 'Duration' column updated to seconds:
       TaskID     TaskName  Duration
    0       1     Analysis    7200.0
    1       2  Development  100800.0
    2       3      Testing    5400.0
    3       4   Deployment   11100.0
    4       5      Meeting       NaN
  • Create a new column:

    import pandas as pd
    import numpy as np
    
    df_new_col = pd.DataFrame({
        'TaskName': ['Analysis', 'Development', 'Testing'],
        'Duration': [np.timedelta64(2, 'h'), pd.Timedelta(days=1, hours=4), np.timedelta64(30, 'm')]
    })
    
    df_new_col['Duration_Seconds'] = df_new_col['Duration'].dt.total_seconds()
    print("DataFrame with new 'Duration_Seconds' column:")
    print(df_new_col)

    Output:

    DataFrame with new 'Duration_Seconds' column:
          TaskName        Duration  Duration_Seconds
    0     Analysis 0 days 02:00:00            7200.0
    1  Development 1 days 04:00:00          100800.0
    2      Testing 0 days 00:30:00            1800.0

Method 2: Dividing by np.timedelta64(1, 's')

Another way to convert a timedelta64[ns] Series to total seconds is to divide it by a timedelta64 object representing one second. This works because Pandas/NumPy handle arithmetic operations between timedelta objects.

import pandas as pd
import numpy as np

df_divide_example = pd.DataFrame({
    'TaskName': ['Analysis', 'Development'],
    'Duration': [np.timedelta64(2, 'h'), pd.Timedelta(days=1, hours=4)]
})

one_second_timedelta = np.timedelta64(1, 's')

duration_in_seconds_div = df_divide_example['Duration'] / one_second_timedelta

print("'Duration' column converted to total seconds (by division):")
print(duration_in_seconds_div)

Output:

'Duration' column converted to total seconds (by division):
0      7200.0
1    100800.0
Name: Duration, dtype: float64
  • This method also correctly converts NaT to NaN.
  • While it works, Series.dt.total_seconds() is generally considered more explicit and idiomatic for this specific conversion.

Handling NaT (Not a Time) Values

Both Series.dt.total_seconds() and division by np.timedelta64(1, 's') will convert NaT values in the original timedelta column to np.nan (Not a Number) in the resulting floating-point Series of seconds. This is usually the desired behavior for representing missing duration data.

import pandas as pd
import numpy as np

df_with_nat = pd.DataFrame({'Duration': [np.timedelta64(1, 'h'), pd.NaT]})

seconds_col = df_with_nat['Duration'].dt.total_seconds()
print("Conversion of NaT to NaN:")
print(seconds_col)

Output:

Conversion of NaT to NaN:
0    3600.0
1       NaN
Name: Duration, dtype: float64

Conclusion

To convert a Pandas DataFrame column from timedelta64[ns] type to total seconds:

  1. The most recommended and idiomatic method is to use the dt accessor with the total_seconds() method:
    df['duration_in_seconds'] = df['your_timedelta_column'].dt.total_seconds()
  2. An alternative is to divide the timedelta column by a numpy.timedelta64(1, 's') object:
    df['duration_in_seconds'] = df['your_timedelta_column'] / np.timedelta64(1, 's')

Both methods produce a column of float dtype representing the total duration in seconds, and correctly handle NaT values by converting them to np.nan. The .dt.total_seconds() method is generally preferred for its explicitness.

Navigation