1. pandas时间操作函数介绍
pandas是Python中用于数据处理和分析的重要库,其中时间序列的操作是非常常见的需求。pandas提供了一系列有效的操作函数,用于处理时间序列数据。这些函数主要体现在以下三个部分:
日期范围生成:我们需要一个日期范围,pandas可以帮我们很方便地生成这个日期范围。
日期的频率和转换:pandas支持频率的转换,而且还提供了一些非常有用的移动和偏移日期的函数。
日期的统计和分组:pandas不能仅仅处理单一的时间点,还可以对时间序列进行分组聚合、时间窗口计算等。
2. 日期范围生成
pandas提供了多种方式生成日期范围,其中最常见的方法是使用date_range()函数。可以通过start参数设置起始时间,通过end参数设置结束时间,通过freq参数设置间隔时间。下面的代码生成了从20190101到20190110的日期范围:
import pandas as pd
date_range = pd.date_range(start='20190101', end='20190110', freq='D')
print(date_range)
输出结果如下:
TIMESTAMP('2019-01-01 00:00:00', freq='D') TIMESTAMP('2019-01-02 00:00:00', freq='D') TIMESTAMP('2019-01-03 00:00:00', freq='D') TIMESTAMP('2019-01-04 00:00:00', freq='D') TIMESTAMP('2019-01-05 00:00:00', freq='D') TIMESTAMP('2019-01-06 00:00:00', freq='D') TIMESTAMP('2019-01-07 00:00:00', freq='D') TIMESTAMP('2019-01-08 00:00:00', freq='D') TIMESTAMP('2019-01-09 00:00:00', freq='D') TIMESTAMP('2019-01-10 00:00:00', freq='D')
可以看到,date_range()函数生成了一个日期范围,包含了从20190101到20190110的10天时间,每一天的时间间隔由freq参数指定,这里我们设置为'D',表示每天。
另一个常见的日期范围生成函数是bdate_range(),它可以生成工作日的日期范围。下面的代码生成从20190101开始的5个工作日:
import pandas as pd
date_range = pd.bdate_range(start='20190101', periods=5)
print(date_range)
输出结果如下:
TIMESTAMP('2019-01-01 00:00:00', freq='B') TIMESTAMP('2019-01-02 00:00:00', freq='B') TIMESTAMP('2019-01-03 00:00:00', freq='B') TIMESTAMP('2019-01-04 00:00:00', freq='B') TIMESTAMP('2019-01-07 00:00:00', freq='B')
可以看到,除了周六和周日,其他工作日都被包含在范围内。
3. 日期频率和转换
3.1 频率转换
pandas提供了一些函数,用于将时间序列数据从一个频率转换为另一个频率。其中最常见的是resample()函数。假设我们有一个包含每小时数据的时间序列:
import pandas as pd
import numpy as np
dateRange = pd.date_range(start='2019-01-01', periods=72, freq='H')
df = pd.DataFrame({'Data':np.random.randint(0, 100, 72)},index=dateRange)
print(df.head(10))
输出结果如下:
Data2019-01-01 00:00:00 71
2019-01-01 01:00:00 70
2019-01-01 02:00:00 35
2019-01-01 03:00:00 11
2019-01-01 04:00:00 50
2019-01-01 05:00:00 44
2019-01-01 06:00:00 7
2019-01-01 07:00:00 85
2019-01-01 08:00:00 2
2019-01-01 09:00:00 84
其中,Data列代表每小时的数据。如果我们需要将小时频率转换为每天频率,可以使用resample()函数,如下:
df=data.data.resample('D').mean()
print(df.head(10))
输出结果如下:
2019-01-01 51.752019-01-02 42.25
2019-01-03 27.25
2019-01-04 59.50
2019-01-05 47.75
Freq: D, Name: Data, dtype: float64
可以看到,函数将每天数据的平均值计算出来,并以每天为频率生成了时间序列。
3.2 移动和偏移日期
pandas提供了一些函数,用于对时间序列数据进行移动或偏移,其中最常见的是shift()函数。该函数可以将时间序列数据移动指定的时间长度。
下面的代码将时间序列向前移动一个单位:
import pandas as pd
import numpy as np
dateRange = pd.date_range(start='2019-01-01', periods=10, freq='D')
df = pd.DataFrame({'Data':np.random.randint(0, 100, 10)},index=dateRange)
print(df.head(10))
shifted=df.shift(1)
print(shifted.head(10))
输出结果如下:
Data2019-01-01 45
2019-01-02 40
2019-01-03 12
2019-01-04 15
2019-01-05 9
2019-01-06 44
2019-01-07 15
2019-01-08 91
2019-01-09 92
2019-01-10 30
Data
2019-01-01 NaN
2019-01-02 45.0
2019-01-03 40.0
2019-01-04 12.0
2019-01-05 15.0
2019-01-06 9.0
2019-01-07 44.0
2019-01-08 15.0
2019-01-09 91.0
2019-01-10 92.0
可以看到,函数将时间序列数据向前移动了一个单位,导致第一个数据变成了Nan。我们还可以将时间序列数据向后偏移,只需将参数设置为负数即可。
4. 日期的统计和分组
在处理时间序列数据时,时间窗口是一个非常常见的需求。时间窗口可以帮助我们计算一段时间内的统计参数,例如某个月份的平均销售额、某周内的最高温度等等。pandas提供了rolling()函数和Grouper对象来实现这一功能。
4.1 rolling()函数
rolling()函数用于创建基于时间窗口的视窗对象。例如,下面的代码计算了一个7天的滑动窗口内的平均值:
import pandas as pd
import numpy as np
dateRange = pd.date_range(start='2019-01-01', periods=31, freq='D')
df = pd.DataFrame({'Data':np.random.randint(0, 100, 31)},index=dateRange)
print(df.head(10))
rolling_mean=df.rolling(window=7).mean()
print(rolling_mean.head(10))
输出结果如下:
Data2019-01-01 6
2019-01-02 15
2019-01-03 18
2019-01-04 52
2019-01-05 28
2019-01-06 52
2019-01-07 41
2019-01-08 16
2019-01-09 46
2019-01-10 21
Data
2019-01-01 NaN
2019-01-02 NaN
2019-01-03 NaN
2019-01-04 NaN
2019-01-05 NaN
2019-01-06 NaN
2019-01-07 29.666667
2019-01-08 33.571429
2019-01-09 35.000000
2019-01-10 30.571429
可以看到,函数计算了一个7天的滑动窗口,每个窗口内的平均值都被计算出来,并返回一个结果序列。
4.2 Grouper对象
Grouper对象可以帮助我们将时间序列数据分组并按组进行聚合计算。
例如,我们有如下时间序列数据,其中Data为每天销售额:
import pandas as pd
import numpy as np
dateRange = pd.date_range(start='2019-01-01', periods=100, freq='D')
df = pd.DataFrame({'Data':np.random.randint(0, 1000, 100)},index=dateRange)
print(df.head(10))
我们可以使用Grouper对象,将日期按月分组并计算每月的平均销售额:
grouper=pd.Grouper(freq='M')
grouped_data = df.groupby(grouper)
grouped_mean = grouped_data.mean()
print(grouped_mean)
输出结果如下:
Data2019-01-31 535.131579
2019-02-28 497.863636
2019-03-31 525.500000
2019-04-30 449.466667
可以看到,通过Grouper对象,我们可以将数据按月分组计算平均销售额。
5. 总结
本文介绍了pandas中常用的时间序列操作函数,包括日期范围生成、日期频率和转换、日期的统计和分组等方面。熟练掌握这些函数对于处理时间序列数据是非常有帮助的。总之,pandas提供了很方便的API,方便用户进行时间序列数据处理。