在 Pandas 中,时间差指的是两个日期时间之间的差值。Pandas 提供了 Timedelta 类型来表示时间差。Timedelta 可以支持多种时间单位,例如天、小时、分钟、秒等。
Timedelta 对象可以通过减法来获得两个日期时间之间的差值,例如:
import pandas as pd
# 创建两个 Pandas Series 对象
s1 = pd.Series(pd.date_range('2022-01-01', periods=3, freq='D'))
s2 = pd.Series(pd.date_range('2022-01-05', periods=3, freq='D'))
# 计算两个 Series 对象中每个日期时间之间的时间差
delta = s2 - s1
print(delta)
输出结果为:
0 4 days
1 5 days
2 6 days
dtype: timedelta64[ns]
在这段代码中,首先创建了两个包含三个日期时间的 Pandas Series 对象,然后用 s2 - s1 来计算两个 Series 对象中每个日期时间之间的时间差。
输出结果中的 timedelta64[ns] 表示时间差的数据类型为 Timedelta 类型。
创建Timedelta对象
我们也可以直接使用 Timedelta 函数来创建 Timedelta 对象。
Timedelta 函数的语法如下:
pd.Timedelta(value, unit=None, errors='raise')
其中:
- 参数 value 表示时间差的值,可以是整数、浮点数或字符串类型。
- 参数 unit 表示时间差的单位,可以是 'D'(天)、'H'(小时)、'T' 或 'min'(分钟)、'S'(秒)、'L' 或 'ms'(毫秒)、'U' 或 'us'(微秒)或 'N'(纳秒)中的任何一个。
- 参数 errors 表示错误处理方式,可以是 'raise'(抛出异常)或 'ignore'(忽略错误)。
下面这个例子使用了多种方式来创建 Timedelta 对象:
import pandas as pd
# 创建一个时间差为 1 天的 Timedelta 对象
td1 = pd.Timedelta(days=1)
print(td1)
# 创建一个时间差为 3 小时的 Timedelta 对象
td2 = pd.Timedelta(hours=3)
print(td2)
# 创建一个时间差为 30 分钟的 Timedelta 对象
td3 = pd.Timedelta(minutes=30)
print(td3)
# 创建一个时间差为 20 秒的 Timedelta 对象
td4 = pd.Timedelta(seconds=20)
print(td4)
# 创建一个时间差为 10 毫秒的 Timedelta 对象
td5 = pd.Timedelta(milliseconds=10)
print(td5)
# 创建一个时间差为 5 微秒的 Timedelta 对象
td6 = pd.Timedelta(microseconds=5)
print(td6)
# 创建一个时间差为 2 天 3 小时 30 分钟的 Timedelta 对象
td7 = pd.Timedelta(days=2, hours=3, minutes=30)
print(td7)
# 创建一个时间差为 1 天 5 小时的 Timedelta 对象,使用字符串表示
td8 = pd.Timedelta('1 days 5 hours')
print(td8)
输出结果如下:
1 days 00:00:00
0 days 03:00:00
0 days 00:30:00
0 days 00:00:20
0 days 00:00:00.010000
0 days 00:00:00.000005
2 days 03:30:00
1 days 05:00:00
在这段代码中,分别创建了 8 个不同的 Timedelta 对象,其中最后一个使用了字符串来表示时间差。
需要注意的是,由于字符串中包含空格,因此需要用引号将字符串括起来。如果字符串中不包含空格,可以直接将字符串作为 value 参数传入 Timedelta 函数。
to_timedelta():转换为Timedelta对象
to_timedelta()函数可以将时间差转换为Timedelta对象的方法。该方法可以将字符串、列表、Series或DataFrame转换为Timedelta对象。
方法语法如下:
pandas.to_timedelta(arg, unit=None, box=True, errors='raise')
参数说明:
- arg:待转换为Timedelta对象的参数,可以是字符串、列表、Series或DataFrame。
- unit:可选参数,表示时间差的单位。默认为None,此时将根据输入参数进行自动推断。支持的时间单位包括:'D'、'day'、'days'、'h'、'hour'、'hours'、'm'、'minute'、'minutes'、's'、'second'、'seconds'、'ms'、'millisecond'、'milliseconds'、'us'、'microsecond'、'microseconds'、'ns'、'nanosecond'、'nanoseconds'。
- box:可选参数,表示返回值类型是否为Series或DataFrame。默认为True,此时返回Series或DataFrame;否则返回数组类型。
- errors:可选参数,表示错误处理方式。默认为'raise',表示遇到错误将抛出异常;可以选择'ignore',表示遇到错误将忽略。
示例代码如下:
import pandas as pd
# 将字符串转换为Timedelta对象
s1 = pd.to_timedelta('1 day 01:02:03.456789')
print(s1) # 输出:1 days 01:02:03.456789
# 将列表转换为Timedelta对象
s2 = pd.to_timedelta([1, 2, 3], unit='h')
print(s2) # 输出:TimedeltaIndex(['0 days 01:00:00', '0 days 02:00:00', '0 days 03:00:00'], dtype='timedelta64[ns]')
# 将Series转换为Timedelta对象
s3 = pd.Series(['01:02:03', '04:05:06', '07:08:09'])
s4 = pd.to_timedelta(s3)
print(s4) # 输出:0 1 days 01:02:03
# 1 1 days 04:05:06
# 2 1 days 07:08:09
# dtype: timedelta64[ns]
# 将DataFrame转换为Timedelta对象
df = pd.DataFrame({'A': ['1 day', '2 days', '3 days'], 'B': ['01:02:03', '04:05:06', '07:08:09']})
df['C'] = pd.to_timedelta(df['A'] + ' ' + df['B'])
print(df) # 输出: A B C
# 0 1 day 01:02:03 1 days 01:02:03
# 1 2 days 04:05:06 2 days 04:05:06
# 2 3 days 07:08:09 3 days 07:08:09
Timedelta时间差相加、相减
除了以上用法外,Timedelta对象还可以进行算数操作,例如加法和减法。下面是一些示例:
import pandas as pd
# 创建两个 Timedelta 对象
td1 = pd.Timedelta(days=1, hours=3, minutes=30)
td2 = pd.Timedelta(hours=6, minutes=45)
# 加法运算
td_sum = td1 + td2
print(td_sum) # 输出 1 days 10:15:00
# 减法运算
td_diff = td1 - td2
print(td_diff) # 输出 16:45:00
在这个例子中,我们创建了两个Timedelta对象td1和td2,并将它们相加和相减。在加法中,两个时间差对象被相加,并将结果存储在td_sum中。在减法中,td2从td1中减去,并将结果存储在td_diff中。注意,加法和减法都遵循了标准的算术运算规则。
此外,我们还可以将Timedelta对象与整数和浮点数相乘和相除,以获得更复杂的时间差。例如:
# 乘法运算
td_product = td1 * 2.5
print(td_product) # 输出 2 days 11:15:00
# 除法运算
td_quotient = td1 / 3
print(td_quotient) # 输出 8:50:00
在这段代码中,我们将td1乘以2.5,并将结果存储在td_product中。我们还将td1除以3,并将结果存储在td_quotient中。请注意,当乘以浮点数时,结果被四舍五入为最接近的微秒。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Padans Timedelta时间差的使用方法 - Python技术站