Pandas 处理时间戳索引

1、对时间序列的处理:
In [193]: from datetime import datetime

In [194]: dates = [
     ...:     datetime(2000, 1, 1),
     ...:     datetime(2000, 1, 2),
     ...:     datetime(2000, 1, 3)
     ...: ]

In [195]: dates      # datetime 列表
Out[195]: 
[datetime.datetime(2000, 1, 1, 0, 0),
 datetime.datetime(2000, 1, 2, 0, 0),
 datetime.datetime(2000, 1, 3, 0, 0)]

In [196]: s = Series(np.random.randn(3), index=dates)

In [197]: s          # 时间戳作为索引的一维数组
Out[197]: 
2000-01-01    0.536546
2000-01-02    0.226604
2000-01-03    0.487324
dtype: float64

In [198]: s.index    # 时间戳索引
Out[198]: DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-03'], 
dtype='datetime64[ns]', freq=None)

In [199]: s.index[0] # 时间戳( datetime 数据类型作索引后,自动转换为时间戳类型 )
Out[199]: Timestamp('2000-01-01 00:00:00')
2、pandas 的 Timestamp 方法生成时间戳:
In [64]: pd.Timestamp('2011/1/1')
Out[64]: Timestamp('2011-01-01 00:00:00')

In [65]: pd.Timestamp('2011-1-1')
Out[65]: Timestamp('2011-01-01 00:00:00')

In [66]: pd.Timestamp(2012,1,2)
Out[66]: Timestamp('2012-01-02 00:00:00')

In [67]: pd.Timestamp('1999-2-2 11:22:33')
Out[67]: Timestamp('1999-02-02 11:22:33')
3、pandas 的 to_datetime 方法生成时间戳索引:
# 格式很灵活
In [74]: pd.to_datetime(['1999/1/1', '1999-2-2', '2222-3-4 12:34:56'])
Out[74]: 
DatetimeIndex(['1999-01-01 00:00:00', '1999-02-02 00:00:00',
               '2222-03-04 12:34:56'],
              dtype='datetime64[ns]', freq=None)

In [75]: pd.to_datetime(['Dec 23, 2011', '1-2-1999', None])
Out[75]: DatetimeIndex(['2011-12-23', '1999-01-02', 'NaT'], 
dtype='datetime64[ns]', freq=None)

# 这是欧洲风格,把第一个数当作日,第二个数当作月
In [76]: pd.to_datetime(['1-2-1999'], dayfirst=True)  
Out[76]: DatetimeIndex(['1999-02-01'], dtype='datetime64[ns]', freq=None)

# pd.to_datetime(Series/DataFrame) 返回值是 Series 数据类型,不是时间戳索引
# 注意,这个返回值的每个元素的数据类型仍然是 Timestamp
In [96]: s = Series(['2011', '2012-3-4'])

In [97]: pd.to_datetime(s)
Out[97]: 
0   2011-01-01
1   2012-03-04
dtype: datetime64[ns]

# year month day 这三项必须有
In [98]: df = DataFrame({
     ...:    'year': [2011, 1987],
     ...:    'month': [1, 2],
     ...:    'day': [3, 4],
     ...:    'hour': [5, 6]
     ...: })

In [99]: pd.to_datetime(df)
Out[99]: 
0   2011-01-03 05:00:00
1   1987-02-04 06:00:00
dtype: datetime64[ns]

In [100]: type(pd.to_datetime(df))
Out[100]: pandas.core.series.Series

In [125]: type(pd.to_datetime(df)[0])
Out[125]: pandas._libs.tslibs.timestamps.Timestamp
4、pandas 的 date_range 方法生成时间戳索引:
# 三个参数依次为:开始时间、结束时间、频率,默认时间戳时刻为每月最后一天零时零分零秒
# Q 表示每季度,M 表示每月,D 表示每天,H 表示每小时,T/MIN 表示每分钟,S 表示每秒
# MS 表示每月第一天,BM 表示每月最后一天
# 5M 表示 5 个月,1h30min 表示 1 小时 30 分钟
# 第三个参数 freq 可以不写,默认频率是 D
In [201]: pd.date_range('1999-1-1', '2000', freq='M')
Out[201]: 
DatetimeIndex(['1999-01-31', '1999-02-28', '1999-03-31', '1999-04-30',
               '1999-05-31', '1999-06-30', '1999-07-31', '1999-08-31',
               '1999-09-30', '1999-10-31', '1999-11-30', '1999-12-31'],
              dtype='datetime64[ns]', freq='M')

In [202]: pd.date_range('1999-1-1', '2000', freq='MS')
Out[202]: 
DatetimeIndex(['1999-01-01', '1999-02-01', '1999-03-01', '1999-04-01',
               '1999-05-01', '1999-06-01', '1999-07-01', '1999-08-01',
               '1999-09-01', '1999-10-01', '1999-11-01', '1999-12-01',
               '2000-01-01'],
              dtype='datetime64[ns]', freq='MS')

# 两个参数为:开始时间、数量
# periods 表示生成多少个时间戳,默认频率为 D
In [226]: pd.date_range('1999.11.1', periods=3)
Out[226]: DatetimeIndex(['1999-11-01', '1999-11-02', '1999-11-03'], 
dtype='datetime64[ns]', freq='D')

# 三个参数依次为:开始时间、数量、频率
In [227]: pd.date_range('1999.11.1', periods=3, freq='M')
Out[227]: DatetimeIndex(['1999-11-30', '1999-12-31', '2000-01-31'], 
dtype='datetime64[ns]', freq='M')
5、时间戳作为索引的 Series 数组用 resample 方法统计数据

resample 就是“重采样”的意思

In [229]: dates = pd.date_range('1999.11.1', periods=9, freq='10D')

In [230]: s = Series(np.arange(1, len(dates)+1), index=dates)

In [231]: s
Out[231]: 
1999-11-01    1
1999-11-11    2
1999-11-21    3
1999-12-01    4
1999-12-11    5
1999-12-21    6
1999-12-31    7
2000-01-10    8
2000-01-20    9
Freq: 10D, dtype: int64

In [232]: s.resample('M').sum()    # 按月重采样求和
Out[232]: 
1999-11-30     6
1999-12-31    22
2000-01-31    17
Freq: M, dtype: int64

In [234]: s.resample('M').mean()   # 按月重采样求平均值
Out[234]: 
1999-11-30    2.0
1999-12-31    5.5
2000-01-31    8.5
Freq: M, dtype: float64

# 按月重采样求平均值后再按天重采样求平均值
In [235]: s.resample('M').mean().resample('D').mean()
Out[235]: 
1999-11-30    2.0
1999-12-01    NaN
1999-12-02    NaN
1999-12-03    NaN
        ...
2000-01-29    NaN
2000-01-30    NaN
2000-01-31    8.5
Freq: D, Length: 63, dtype: float64

# 同上操作用 ffill 处理缺失值 NaN
In [236]: s.resample('M').mean().resample('D').mean().ffill()
Out[236]: 
1999-11-30    2.0
1999-12-01    2.0
1999-12-02    2.0
        ...
2000-01-29    5.5
2000-01-30    5.5
2000-01-31    8.5
Freq: D, Length: 63, dtype: float64

In [269]: s
Out[269]: 
2011-01-01    0
2011-01-11    1
2011-01-21    2
2011-01-31    3
2011-02-10    4
2011-02-20    5
2011-03-02    6
2011-03-12    7
2011-03-22    8
2011-04-01    9
Freq: 10D, dtype: int64

# 按照月份进行降采样,并将每月的数据的原值、最大值、最小值、以及临近值列出
# ohlc:open high low close
In [270]: s.resample('m').ohlc()
Out[270]: 
            open  high  low  close
2011-01-31     0     3    0      3
2011-02-28     4     5    4      5
2011-03-31     6     8    6      8
2011-04-30     9     9    9      9
6、与时间戳对应的时间间隔和时间间隔索引,时间间隔就是时间段,使用 pd.Periodpd.period_range 方法:
# 生成时间间隔
In [45]: pd.Period('2011')
Out[45]: Period('2011', 'A-DEC')

In [46]: pd.Period('2011-1')
Out[46]: Period('2011-01', 'M')

# 生成时间间隔索引,参数与 date_range 类似
In [47]: pd.period_range('2011', '2012', freq='m')
Out[47]: 
PeriodIndex(['2011-01', '2011-02', '2011-03', '2011-04', '2011-05', 
             '2011-06', '2011-07', '2011-08', '2011-09', '2011-10', 
             '2011-11', '2011-12', '2012-01'],
            dtype='period[M]', freq='M')

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

推荐阅读更多精彩内容