python pandas时间操作函数

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))

输出结果如下:

                     Data

2019-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.75

2019-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))

输出结果如下:

            Data

2019-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))

输出结果如下:

            Data

2019-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)

输出结果如下:

                  Data

2019-01-31 535.131579

2019-02-28 497.863636

2019-03-31 525.500000

2019-04-30 449.466667

可以看到,通过Grouper对象,我们可以将数据按月分组计算平均销售额。

5. 总结

本文介绍了pandas中常用的时间序列操作函数,包括日期范围生成、日期频率和转换、日期的统计和分组等方面。熟练掌握这些函数对于处理时间序列数据是非常有帮助的。总之,pandas提供了很方便的API,方便用户进行时间序列数据处理。

后端开发标签