Python Pandas - Timedelta
Pandas - Timedelta 对象
Section titled “Pandas - Timedelta 对象”Pandas 中的 Timedelta 对象表示持续时间或两个日期或时间点之间的差值。它们等同于 Python 的 datetime.timedelta,并使用 NumPy 的 timedelta64[ns] 类型(纳秒精度)高效实现。
Timedelta 可以是正值或负值,并以天、小时、分钟、秒、毫秒、微秒或纳秒等单位表示。
您可以通过以下几种方式创建 Timedelta 对象:
从字符串创建
Section titled “从字符串创建”Pandas 可以解析表示持续时间的字符串。
import pandas as pd
# Create Timedelta from a stringtd1 = pd.Timedelta('2 days 2 hours 15 minutes 30 seconds')print(f"String '2 days 2 hours 15 minutes 30 seconds': {td1}")
td2 = pd.Timedelta('5d 3h') # Abbreviated formatprint(f"String '5d 3h': {td2}")
td3 = pd.Timedelta('-1 days + 12:00:00') # Negative timedeltaprint(f"String '-1 days + 12:00:00': {td3}")输出:
String '2 days 2 hours 15 minutes 30 seconds': 2 days 02:15:30String '5d 3h': 5 days 03:00:00String '-1 days + 12:00:00': -1 days +12:00:00从带单位的整数创建
Section titled “从带单位的整数创建”传递一个整数值,并使用 unit 参数指定时间单位。
import pandas as pd
# Create Timedelta from integer and unittd_hours = pd.Timedelta(6, unit='h') # 6 hoursprint(f"Integer 6, unit='h': {td_hours}")
td_minutes = pd.Timedelta(150, unit='m') # 150 minutesprint(f"Integer 150, unit='m': {td_minutes}")
td_days = pd.Timedelta(3, unit='D') # 3 days (Use 'D' for days)print(f"Integer 3, unit='D': {td_days}")输出:
Integer 6, unit='h': 0 days 06:00:00Integer 150, unit='m': 0 days 02:30:00Integer 3, unit='D': 3 days 00:00:00常用单位包括:'W'(周)、'D'(天)、'h'(小时)、'm'(分钟)、's'(秒)、'ms'(毫秒)、'us'(微秒)、'ns'(纳秒)。
使用关键字参数(偏移量)创建
Section titled “使用关键字参数(偏移量)创建”类似于 Python 的 datetime.timedelta,您可以使用 weeks、days、hours、minutes、seconds、milliseconds、microseconds、nanoseconds 等关键字参数。
import pandas as pd
# Create Timedelta using keyword argumentstd_days_kw = pd.Timedelta(days=2)print(f"Keyword days=2: {td_days_kw}")
td_complex = pd.Timedelta(days=1, hours=5, minutes=30)print(f"Keyword days=1, hours=5, minutes=30: {td_complex}")输出:
Keyword days=2: 2 days 00:00:00Keyword days=1, hours=5, minutes=30: 1 days 05:30:00使用 pd.to_timedelta() 转换数据
Section titled “使用 pd.to_timedelta() 转换数据”顶级的 pd.to_timedelta() 函数是一个通用工具,用于将各种输入(标量、数组、列表、Series)转换为 Timedelta 对象。它能智能地解析字符串或根据指定的 unit 解释数字。
import pandas as pd
# Convert a list of stringsstr_list = ['1h 30m', '2 days', '-50s']td_index = pd.to_timedelta(str_list)print(f"Converted from list of strings:\n{td_index}")
# Convert a Series of numbers (assuming unit is days)num_series = pd.Series([1, 2.5, -0.5])td_series_days = pd.to_timedelta(num_series, unit='D')print(f"\nConverted from Series (unit='D'):\n{td_series_days}")
# Handling errors during conversionbad_input = ['3 hours', '4 days', 'invalid data']td_with_errors = pd.to_timedelta(bad_input, errors='coerce') # 'coerce' turns errors into NaTprint(f"\nConverted with errors='coerce':\n{td_with_errors}")输出:
Converted from list of strings:TimedeltaIndex(['0 days 01:30:00', '2 days 00:00:00', '-1 days +23:59:10'], dtype='timedelta64[ns]', freq=None)
Converted from Series (unit='D'):0 1 days 00:00:001 2 days 12:00:002 -1 days +12:00:00dtype: timedelta64[ns]
Converted with errors='coerce':TimedeltaIndex(['0 days 03:00:00', '4 days 00:00:00', NaT], dtype='timedelta64[ns]', freq=None)to_timedelta 中的 errors 参数可以是 'raise'(默认值)、'coerce'(无效解析变为 NaT - Not a Time,非时间)或 'ignore'(如果无法解析,则返回输入值)。
Timedelta 的运算
Section titled “Timedelta 的运算”Timedelta 可以添加到 Timestamp 或 datetime 对象中,或从中减去,以在时间上移动它们。您也可以在 Timedelta 之间执行算术运算。
让我们创建一个包含 Timestamp 和 Timedelta 的 DataFrame:
import pandas as pd
# Series of Timestampstimestamps = pd.Series(pd.date_range('2023-03-10', periods=4, freq='D'))
# Series of Timedeltasdurations = pd.Series([pd.Timedelta(days=i, hours=i*6) for i in range(4)])
df = pd.DataFrame({'Start_Time': timestamps, 'Duration': durations})
print("Original DataFrame:")print(df)输出:
Original DataFrame: Start_Time Duration0 2023-03-10 0 days 00:00:001 2023-03-11 1 days 06:00:002 2023-03-12 2 days 12:00:003 2023-03-13 3 days 18:00:00将 Timedelta 添加到 Timestamp 中以获得未来的 Timestamp。
# (Using df from previous example)
# Calculate End_Time = Start_Time + Durationdf['End_Time'] = df['Start_Time'] + df['Duration']
# Add a fixed duration (e.g., 1 hour) to Start_Timedf['Start_Plus_1H'] = df['Start_Time'] + pd.Timedelta(hours=1)
print("\nDataFrame after Addition Operations:")print(df)输出:
DataFrame after Addition Operations: Start_Time Duration End_Time Start_Plus_1H0 2023-03-10 0 days 00:00:00 2023-03-10 00:00:00 2023-03-10 01:00:001 2023-03-11 1 days 06:00:00 2023-03-12 06:00:00 2023-03-11 01:00:002 2023-03-12 2 days 12:00:00 2023-03-14 12:00:00 2023-03-12 01:00:003 2023-03-13 3 days 18:00:00 2023-03-17 06:00:00 2023-03-13 01:00:00减去两个 Timestamp 会得到一个 Timedelta。从 Timestamp 中减去 Timedelta 会得到过去的 Timestamp。
# (Using df with 'End_Time' from previous example)
# Calculate the difference between End_Time and Start_Time (should equal Duration)df['Calculated_Duration'] = df['End_Time'] - df['Start_Time']
# Calculate Time Before Start = Start_Time - 12 hoursdf['Start_Minus_12H'] = df['Start_Time'] - pd.Timedelta(hours=12)
print("\nDataFrame after Subtraction Operations:")# Display relevant columns for clarityprint(df[['Start_Time', 'End_Time', 'Duration', 'Calculated_Duration', 'Start_Minus_12H']])输出:
DataFrame after Subtraction Operations: Start_Time End_Time Duration Calculated_Duration Start_Minus_12H0 2023-03-10 2023-03-10 00:00:00 0 days 00:00:00 0 days 00:00:00 2023-03-09 12:00:001 2023-03-11 2023-03-12 06:00:00 1 days 06:00:00 1 days 06:00:00 2023-03-10 12:00:002 2023-03-12 2023-03-14 12:00:00 2 days 12:00:00 2 days 12:00:00 2023-03-11 12:00:003 2023-03-13 2023-03-17 06:00:00 3 days 18:00:00 3 days 18:00:00 2023-03-12 12:00:00Timedelta 对于时间序列数据中的时间计算、区间分析和特征工程至关重要。