Pandas 二十一:怎样快捷方便的处理日期数据

Pandas日期处理的作用:将2018-01-01、1/1/2018等多种日期格式映射成统一的格式对象,在该对象上提供强大的功能支持

几个概念:

1.pd.to_datetime:pandas的一个函数,能将字符串、列表、series变成日期形式
2.Timestamp:pandas表示日期的对象形式
3.DatetimeIndex:pandas表示日期的对象列表形式

其中:

  • DatetimeIndex是Timestamp的列表形式
  • pd.to_datetime对单个日期字符串处理会得到Timestamp
  • pd.to_datetime对日期字符串列表处理会得到DatetimeIndex

在这里插入图片描述

问题:怎样统计每周、每月、每季度的最高温度?

1、读取天气数据到dataframe

1

import pandas as pd
%matplotlib inline
No output

2

fpath = "./datas/beijing_tianqi/beijing_tianqi_2018.csv"
df = pd.read_csv(fpath)
# 替换掉温度的后缀℃
df.loc[:, "bWendu"] = df["bWendu"].str.replace("℃", "").astype('int32')
df.loc[:, "yWendu"] = df["yWendu"].str.replace("℃", "").astype('int32')
df.head()

2

ymd	bWendu	yWendu	tianqi	fengxiang	fengli	aqi	aqiInfo	aqiLevel
0	2018-01-01	3	-6~多云	东北风	1-2592
1	2018-01-02	2	-5~多云	东北风	1-2491
2	2018-01-03	2	-5	多云	北风	1-2281
3	2018-01-04	0	-8	阴	东北风	1-2281
4	2018-01-05	3	-6	多云~晴	西北风	1-2501

2、将日期列转换成pandas的日期

3

df.set_index(pd.to_datetime(df["ymd"]), inplace=True)

4

df.head()

4

ymd	bWendu	yWendu	tianqi	fengxiang	fengli	aqi	aqiInfo	aqiLevel
ymd									
2018-01-01	2018-01-01	3	-6~多云	东北风	1-2592
2018-01-02	2018-01-02	2	-5~多云	东北风	1-2491
2018-01-03	2018-01-03	2	-5	多云	北风	1-2281
2018-01-04	2018-01-04	0	-8	阴	东北风	1-2281
2018-01-05	2018-01-05	3	-6	多云~晴	西北风	1-2501

5

df.index

5

DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04',
               '2018-01-05', '2018-01-06', '2018-01-07', '2018-01-08',
               '2018-01-09', '2018-01-10',
               ...
               '2018-12-22', '2018-12-23', '2018-12-24', '2018-12-25',
               '2018-12-26', '2018-12-27', '2018-12-28', '2018-12-29',
               '2018-12-30', '2018-12-31'],
              dtype='datetime64[ns]', name='ymd', length=365, freq=None)

6

# DatetimeIndex是Timestamp的列表形式
df.index[0]

6

Timestamp('2018-01-01 00:00:00')

3、 方便的对DatetimeIndex进行查询

7

# 筛选固定的某一天
df.loc['2018-01-05']

7

ymd          2018-01-05
bWendu                3
yWendu               -6
tianqi             多云~晴
fengxiang           西北风
fengli             1-2级
aqi                  50
aqiInfo               优
aqiLevel              1
Name: 2018-01-05 00:00:00, dtype: object

8

# 日期区间
df.loc['2018-01-05':'2018-01-10']

8

				ymd	 bWendu yWendu	tianqi	fengxiang	fengli	aqi	aqiInfo	aqiLevel
	ymd									
2018-01-05	2018-01-05	3	-6	多云~晴	西北风			1-2501
2018-01-06	2018-01-06	2	-5	多云~阴	西南风			1-2321
2018-01-07	2018-01-07	2	-4~多云	西南风			1-2592
2018-01-08	2018-01-08	2	-6	晴	西北风				4-5501
2018-01-09	2018-01-09	1	-8	晴	西北风				3-4341
2018-01-10	2018-01-10	-2	-10	晴	西北风				1-2261

10

# 按月份前缀筛选
df.loc['2018-03']

10

               ymd	bWendu	yWendu	tianqi	fengxiang	fengli	aqi	aqiInfo	aqiLevel
ymd									
2018-03-01	2018-03-01	8	-3	多云	西南风	1-2461
2018-03-02	2018-03-02	9	-1~多云	北风	1-2952
2018-03-03	2018-03-03	13	3	多云~阴	北风	1-2214	重度污染	5
2018-03-04	2018-03-04	7	-2~多云	东南风	1-2144	轻度污染	3
2018-03-05	2018-03-05	8	-3	晴	南风	1-2942
2018-03-06	2018-03-06	6	-3	多云~阴	东南风	3-4672
2018-03-07	2018-03-07	6	-2~多云	北风	1-2652
2018-03-08	2018-03-08	8	-4	晴	东北风	1-2622
2018-03-09	2018-03-09	10	-2	多云	西南风	1-2132	轻度污染	3
2018-03-10	2018-03-10	14	-2	晴	东南风	1-2171	中度污染	4
2018-03-11	2018-03-11	11	0	多云	南风	1-2812
2018-03-12	2018-03-12	15	3	多云~晴	南风	1-2174	中度污染	4
2018-03-13	2018-03-13	17	5~多云	南风	1-2287	重度污染	5
2018-03-14	2018-03-14	15	6	多云~阴	东北风	1-2293	重度污染	5
2018-03-15	2018-03-15	12	-1	多云~晴	东北风	3-4702
2018-03-16	2018-03-16	10	-1	多云	南风	1-2582
2018-03-17	2018-03-17	4	0	小雨~阴	南风	1-2812
2018-03-18	2018-03-18	13	1	多云~晴	西南风	1-2134	轻度污染	3
2018-03-19	2018-03-19	13	2	多云	东风	1-2107	轻度污染	3
2018-03-20	2018-03-20	10	-2	多云	南风	1-2411
2018-03-21	2018-03-21	11	1	多云	西南风	1-2762
2018-03-22	2018-03-22	17	4~多云	西南风	1-2112	轻度污染	3
2018-03-23	2018-03-23	18	5	多云	北风	1-2146	轻度污染	3
2018-03-24	2018-03-24	22	5	晴	西南风	1-2119	轻度污染	3
2018-03-25	2018-03-25	24	7	晴	南风	1-2782
2018-03-26	2018-03-26	25	7	多云	西南风	1-2151	中度污染	4
2018-03-27	2018-03-27	27	11	晴	南风	1-2243	重度污染	5
2018-03-28	2018-03-28	25	9	多云~晴	东风	1-2387	严重污染	6
2018-03-29	2018-03-29	19	7	晴	南风	1-2119	轻度污染	3
2018-03-30	2018-03-30	18	8	多云	南风	1-2682
2018-03-31	2018-03-31	23	9	多云~晴	南风	1-2125	轻度污染	3

11

# 按月份前缀筛选
df.loc["2018-07":"2018-09"].index

11

DatetimeIndex(['2018-07-01', '2018-07-02', '2018-07-03', '2018-07-04',
               '2018-07-05', '2018-07-06', '2018-07-07', '2018-07-08',
               '2018-07-09', '2018-07-10', '2018-07-11', '2018-07-12',
               '2018-07-13', '2018-07-14', '2018-07-15', '2018-07-16',
               '2018-07-17', '2018-07-18', '2018-07-19', '2018-07-20',
               '2018-07-21', '2018-07-22', '2018-07-23', '2018-07-24',
               '2018-07-25', '2018-07-26', '2018-07-27', '2018-07-28',
               '2018-07-29', '2018-07-30', '2018-07-31', '2018-08-01',
               '2018-08-02', '2018-08-03', '2018-08-04', '2018-08-05',
               '2018-08-06', '2018-08-07', '2018-08-08', '2018-08-09',
               '2018-08-10', '2018-08-11', '2018-08-12', '2018-08-13',
               '2018-08-14', '2018-08-15', '2018-08-16', '2018-08-17',
               '2018-08-18', '2018-08-19', '2018-08-20', '2018-08-21',
               '2018-08-22', '2018-08-23', '2018-08-24', '2018-08-25',
               '2018-08-26', '2018-08-27', '2018-08-28', '2018-08-29',
               '2018-08-30', '2018-08-31', '2018-09-01', '2018-09-02',
               '2018-09-03', '2018-09-04', '2018-09-05', '2018-09-06',
               '2018-09-07', '2018-09-08', '2018-09-09', '2018-09-10',
               '2018-09-11', '2018-09-12', '2018-09-13', '2018-09-14',
               '2018-09-15', '2018-09-16', '2018-09-17', '2018-09-18',
               '2018-09-19', '2018-09-20', '2018-09-21', '2018-09-22',
               '2018-09-23', '2018-09-24', '2018-09-25', '2018-09-26',
               '2018-09-27', '2018-09-28', '2018-09-29', '2018-09-30'],
              dtype='datetime64[ns]', name='ymd', freq=None)

12

# 按年份前缀筛选
df.loc["2018"].head()

12

ymd	bWendu	yWendu	tianqi	fengxiang	fengli	aqi	aqiInfo	aqiLevel
ymd									
2018-01-01	2018-01-01	3	-6~多云	东北风	1-2592
2018-01-02	2018-01-02	2	-5~多云	东北风	1-2491
2018-01-03	2018-01-03	2	-5	多云	北风	1-2281
2018-01-04	2018-01-04	0	-8	阴	东北风	1-2281
2018-01-05	2018-01-05	3	-6	多云~晴	西北风	1-2501

4、方便的获取周、月、季度

Timestamp、DatetimeIndex支持大量的属性可以获取日期分量:
https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#time-date-components
13

# 周数字列表
df.index.week

13

Int64Index([ 1,  1,  1,  1,  1,  1,  1,  2,  2,  2,
            ...
            51, 51, 52, 52, 52, 52, 52, 52, 52,  1],
           dtype='int64', name='ymd', length=365)

14

# 月数字列表
df.index.month

14

Int64Index([ 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
            ...
            12, 12, 12, 12, 12, 12, 12, 12, 12, 12],
           dtype='int64', name='ymd', length=365)

15

# 季度数字列表
df.index.quarter

15

Int64Index([1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
            ...
            4, 4, 4, 4, 4, 4, 4, 4, 4, 4],
           dtype='int64', name='ymd', length=365)

5、统计每周、每月、每个季度的最高温度

统计每周的数据
16

df.groupby(df.index.week)["bWendu"].max().head()

16

ymd
1    3
2    6
3    7
4   -1
5    4
Name: bWendu, dtype: int32

17

df.groupby(df.index.week)["bWendu"].max().plot()

17
<matplotlib.axes._subplots.AxesSubplot at 0x23300b75b88>

统计每个月的数据
18

df.groupby(df.index.month)["bWendu"].max()

18

ymd
1      7
2     12
3     27
4     30
5     35
6     38
7     37
8     36
9     31
10    25
11    18
12    10
Name: bWendu, dtype: int32

19

df.groupby(df.index.month)["bWendu"].max().plot()

19
<matplotlib.axes._subplots.AxesSubplot at 0x23302dac4c8>

统计每个季度的数据
20

df.groupby(df.index.quarter)["bWendu"].max()

20

ymd
1    27
2    38
3    37
4    25
Name: bWendu, dtype: int32

21

df.groupby(df.index.quarter)["bWendu"].max().plot()

21
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值