Python Pandas – 获取内部兼容性的纳秒级时间差
在使用Python Pandas进行数据分析时,日期时间的处理是非常常见且必要的一部分。除了常见的时间戳(timestamp)和时间间隔(timedelta)数据类型外,Pandas还提供了一个内部兼容性的纳秒级时间差(Timedelta)数据类型。
Timedelta数据类型简介
Timedelta数据类型表示两个日期或时间戳之间的时间差,可以用来进行时间的加减、比较和格式化输出等操作。Pandas中的Timedelta数据类型支持多种时间单位,包括纳秒(ns)、微秒(us)、毫秒(ms)、秒(s)、分钟(m或min)、小时(h)、天(d)等。
可以使用Pandas的to_timedelta()函数来将字符串、列表、Series等对象转换为Timedelta类型的对象。
import pandas as pd
str_list = ['2 days 3 hours 30 minutes 15 seconds',
'1 day 6 hours 45 minutes 17 seconds',
'12 days 10 hours 5 minutes 23 seconds',
'6 hours 20 minutes 12 seconds']
td = pd.to_timedelta(str_list)
print(td)
输出结果如下:
0 2 days 03:30:15
1 1 day 06:45:17
2 12 days 10:05:23
3 06:20:12
dtype: timedelta64[ns]
可以看到,Pandas自动将字符串中的时间单位解析为相应的时间差,并以Timedelta类型的对象输出。如果要将Timedelta类型的对象转换为时间戳,可以使用pd.Timestamp()
pd.Timestamp('2018-01-01') + td
输出结果如下:
0 2018-01-03 03:30:15
1 2018-01-02 06:45:17
2 2018-01-13 10:05:23
3 2018-01-01 06:20:12
dtype: datetime64[ns]
Timedelta数据类型的属性和方法
类似于Datetime数据类型,Timedelta数据类型也有一些属性和方法可供使用。
属性
days: 时间差的天数部分(以天为单位)seconds: 时间差的秒数部分(以秒为单位)microseconds: 时间差的微秒数部分(以微秒为单位)nanoseconds: 时间差的纳秒数部分(以纳秒为单位)components: 将时间差表示为(datetime64, timedelta64)元组的形式
import pandas as pd
td = pd.to_timedelta(['2 days 3 hours 30 minutes 15 seconds'])
print(f"天数:{td.dt.days[0]}")
print(f"秒数:{td.dt.seconds[0]}")
print(f"微秒数:{td.dt.microseconds[0]}")
print(f"纳秒数:{td.dt.nanoseconds[0]}")
print(f"元组形式:{td.dt.components}")
输出结果如下:
天数:2
秒数:12615
微秒数:0
纳秒数:0
元组形式: days hours minutes seconds milliseconds microseconds nanoseconds
0 2 3 30 15 0 0 0
方法
astype(): 将时间差转换为指定的时间单位floor(): 将时间差向下舍入到指定的时间单位ceil(): 将时间差向上舍入到指定的时间单位round(): 将时间差四舍五入到指定的时间单位
import pandas as pd
td = pd.to_timedelta(['2 days 3 hours 30 minutes 15 seconds'])
print(td.astype('m')) # 转换为分钟
print(td.floor('h')) # 向下舍入到小时
print(td.ceil('h'))# 继续输出
输出结果如下:
```Python
0 3120 minutes
dtype: timedelta64[ns]
0 2 days 00:00:00
dtype: timedelta64[ns]
0 3 days 00:00:00
dtype: timedelta64[ns]
以上方法均可以通过参数指定时间单位进行操作。
Timedelta数据类型的运算
Timedelta数据类型支持与标量、另一个Timedelta对象和Series对象的加减和比较运算。在进行运算时,Pandas会自动将各个对象的时间单位对齐,并根据需要进行日期时间的转换和调整。
加减运算
import pandas as pd
td1 = pd.to_timedelta(['2 days 3 hours 30 minutes 15 seconds'])
td2 = pd.to_timedelta(['1 days 5 hours 15 minutes 30 seconds'])
print(td1 + td2) # 时间差的加法运算
print(td1 - td2) # 时间差的减法运算
print(td1 + pd.Timedelta('3h')) # 时间差与标量的加法运算
print(td1 - pd.Timedelta('5h')) # 时间差与标量的减法运算
输出结果如下:
0 3 days 08:45:45
dtype: timedelta64[ns]
0 0 days 22:14:45
dtype: timedelta64[ns]
0 2 days 06:30:15
dtype: timedelta64[ns]
0 1 days 22:30:15
dtype: timedelta64[ns]
比较运算
可以使用<、>、<=、>=、==、!=等运算符对两个时间差进行比较。
import pandas as pd
td1 = pd.to_timedelta(['2 days 3 hours 30 minutes 15 seconds'])
td2 = pd.to_timedelta(['1 days 5 hours 15 minutes 30 seconds'])
print(td1 > td2)
print(td1 == td2)
print(td1 != td2)
输出结果如下:
0 True
dtype: bool
0 False
dtype: bool
0 True
dtype: bool
注意,两个时间差必须有相同的时间单位才能进行比较。
结论
在Python Pandas中,Timedelta数据类型是一种非常实用的数据类型,可以用来表示并操作不同日期或时间戳之间的时间差。使用Timedelta数据类型,我们可以方便地进行时间的加减、比较、格式化等操作,从而更加轻松地完成数据分析任务。
极客笔记