21 Pandas怎样快捷方便的处理日期数据

21 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

import pandas as pd %matplotlib inline 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()
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
0 2018-01-01 3 -6 晴~多云 东北风 1-2级 59 2
1 2018-01-02 2 -5 阴~多云 东北风 1-2级 49 1
2 2018-01-03 2 -5 多云 北风 1-2级 28 1
3 2018-01-04 0 -8 东北风 1-2级 28 1
4 2018-01-05 3 -6 多云~晴 西北风 1-2级 50 1

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

df.set_index(pd.to_datetime(df["ymd"]), inplace=True) df.head()
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
ymd
2018-01-01 2018-01-01 3 -6 晴~多云 东北风 1-2级 59 2
2018-01-02 2018-01-02 2 -5 阴~多云 东北风 1-2级 49 1
2018-01-03 2018-01-03 2 -5 多云 北风 1-2级 28 1
2018-01-04 2018-01-04 0 -8 东北风 1-2级 28 1
2018-01-05 2018-01-05 3 -6 多云~晴 西北风 1-2级 50 1
df.index 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) # DatetimeIndex是Timestamp的列表形式 df.index[0] Timestamp('2018-01-01 00:00:00')

3、 方便的对DatetimeIndex进行查询

# 筛选固定的某一天 df.loc['2018-01-05'] 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 # 日期区间 df.loc['2018-01-05':'2018-01-10']
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
ymd
2018-01-05 2018-01-05 3 -6 多云~晴 西北风 1-2级 50 1
2018-01-06 2018-01-06 2 -5 多云~阴 西南风 1-2级 32 1
2018-01-07 2018-01-07 2 -4 阴~多云 西南风 1-2级 59 2
2018-01-08 2018-01-08 2 -6 西北风 4-5级 50 1
2018-01-09 2018-01-09 1 -8 西北风 3-4级 34 1
2018-01-10 2018-01-10 -2 -10 西北风 1-2级 26 1
# 按月份前缀筛选 df.loc['2018-03']
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
ymd
2018-03-01 2018-03-01 8 -3 多云 西南风 1-2级 46 1
2018-03-02 2018-03-02 9 -1 晴~多云 北风 1-2级 95 2
2018-03-03 2018-03-03 13 3 多云~阴 北风 1-2级 214 重度污染 5
2018-03-04 2018-03-04 7 -2 阴~多云 东南风 1-2级 144 轻度污染 3
2018-03-05 2018-03-05 8 -3 南风 1-2级 94 2
2018-03-06 2018-03-06 6 -3 多云~阴 东南风 3-4级 67 2
2018-03-07 2018-03-07 6 -2 阴~多云 北风 1-2级 65 2
2018-03-08 2018-03-08 8 -4 东北风 1-2级 62 2
2018-03-09 2018-03-09 10 -2 多云 西南风 1-2级 132 轻度污染 3
2018-03-10 2018-03-10 14 -2 东南风 1-2级 171 中度污染 4
2018-03-11 2018-03-11 11 0 多云 南风 1-2级 81 2
2018-03-12 2018-03-12 15 3 多云~晴 南风 1-2级 174 中度污染 4
2018-03-13 2018-03-13 17 5 晴~多云 南风 1-2级 287 重度污染 5
2018-03-14 2018-03-14 15 6 多云~阴 东北风 1-2级 293 重度污染 5
2018-03-15 2018-03-15 12 -1 多云~晴 东北风 3-4级 70 2
2018-03-16 2018-03-16 10 -1 多云 南风 1-2级 58 2
2018-03-17 2018-03-17 4 0 小雨~阴 南风 1-2级 81 2
2018-03-18 2018-03-18 13 1 多云~晴 西南风 1-2级 134 轻度污染 3
2018-03-19 2018-03-19 13 2 多云 东风 1-2级 107 轻度污染 3
2018-03-20 2018-03-20 10 -2 多云 南风 1-2级 41 1
2018-03-21 2018-03-21 11 1 多云 西南风 1-2级 76 2
2018-03-22 2018-03-22 17 4 晴~多云 西南风 1-2级 112 轻度污染 3
2018-03-23 2018-03-23 18 5 多云 北风 1-2级 146 轻度污染 3
2018-03-24 2018-03-24 22 5 西南风 1-2级 119 轻度污染 3
2018-03-25 2018-03-25 24 7 南风 1-2级 78 2
2018-03-26 2018-03-26 25 7 多云 西南风 1-2级 151 中度污染 4
2018-03-27 2018-03-27 27 11 南风 1-2级 243 重度污染 5
2018-03-28 2018-03-28 25 9 多云~晴 东风 1-2级 387 严重污染 6
2018-03-29 2018-03-29 19 7 南风 1-2级 119 轻度污染 3
2018-03-30 2018-03-30 18 8 多云 南风 1-2级 68 2
2018-03-31 2018-03-31 23 9 多云~晴 南风 1-2级 125 轻度污染 3
# 按月份前缀筛选 df.loc["2018-07":"2018-09"].index 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) # 按年份前缀筛选 df.loc["2018"].head()
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
ymd
2018-01-01 2018-01-01 3 -6 晴~多云 东北风 1-2级 59 2
2018-01-02 2018-01-02 2 -5 阴~多云 东北风 1-2级 49 1
2018-01-03 2018-01-03 2 -5 多云 北风 1-2级 28 1
2018-01-04 2018-01-04 0 -8 东北风 1-2级 28 1
2018-01-05 2018-01-05 3 -6 多云~晴 西北风 1-2级 50 1

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

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

# 周数字列表 df.index.week 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) # 月数字列表 df.index.month 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) # 季度数字列表 df.index.quarter 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、统计每周、每月、每个季度的最高温度

统计每周的数据

df.groupby(df.index.week)["bWendu"].max().head() ymd 1 3 2 6 3 7 4 -1 5 4 Name: bWendu, dtype: int32 df.groupby(df.index.week)["bWendu"].max().plot() <matplotlib.axes._subplots.AxesSubplot at 0x23300b75b88>

统计每个月的数据

df.groupby(df.index.month)["bWendu"].max() 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 df.groupby(df.index.month)["bWendu"].max().plot() <matplotlib.axes._subplots.AxesSubplot at 0x23302dac4c8>

统计每个季度的数据

df.groupby(df.index.quarter)["bWendu"].max()
ymd
1    27
2    38
3    37
4    25
Name: bWendu, dtype: int32
df.groupby(df.index.quarter)["bWendu"].max().plot() <matplotlib.axes._subplots.AxesSubplot at 0x23302e338c8>

本文使用 文章同步助手 同步

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容