datetime 索引_python入门 | pandas的datetime

5025d8f19352b57904d41692f77dfdd0.png

时间模块:datetime

1.datetime.date:date对象 年月日

  • datetime.date.today()
  • 该对象类型为datetime.date
  • 可以通过str函数转化为str
In 

2.datetime.datetime:datetime对象 年月日时分秒-

  • datetime.datetime.now() datetime.datetime.today()
  • 对象类型为datetime.datetime
  • 可以通过str函数转为str
In 
  • 创建datetime对象:datetime.datetime(x,x,x,x,x)
  • 无时间默认0点
In 
  • 相减得到时间差
In [13]: t2-t1
Out[13]: datetime.timedelta(days=-882, seconds=45873)

3.datetime.timedelta:时间差

  • datetime.timedelta(number)
In 

(pandas的datetime和period具体里都可以精确到秒,只是总体上看单个datetime输出是单日,单个period输出是时期)

Pandas的单日:Datetime

(Pandas时刻数据:Timestamp) 与 (Pandas 时间戳索引:DatetimeIndex)

输入的日期各种格式都可以解析,但无法支持中文

'2017-12-21'   '20170101'   '1/13/2017'   '2017/1/1'

1 介绍

1.创建单个timestamp:

  • pd.Timestamp(时间数据) 年月日时分秒
In [20]: t1 = pd.Timestamp( datetime.datetime(2016,12,1,12,45,30) )

In [21]: t2 = pd.Timestamp('2017-12-21')

In [24]: t3 = pd.Timestamp('2017-12-21 15:00:22')

In [25]: print(t3)
2017-12-21 15:00:22

In [22]: print(t1,type(t1))
2016-12-01 12:45:30 <class 'pandas._libs.tslibs.timestamps.Timestamp'>

In [23]: print(t2,type(t2))
2017-12-21 00:00:00 <class 'pandas._libs.tslibs.timestamps.Timestamp'>
  • pd.to_datetime(时间数据)
In 

2. 创建时间戳索引:

  • pd.to_datetime(时间数据)
  • 序列中夹着其他数据时:一定要参数errors = ‘ignore’(直接生成一般数组)/‘coerce’(缺失值生成NaT,返回datetimeindex
In [29]: st_date = [ '2017-12-21', '2017-12-22', '2017-12-23']

In [30]: t3 = pd.to_datetime(st_date)

In [31]: print(t3,type(t3))
DatetimeIndex(['2017-12-21', '2017-12-22', '2017-12-23'], dtype='datetime64[ns]', freq=None) <class 'pandas.core.indexes.datetimes.DatetimeIndex'>


# 参数errors
In [35]: date3 = ['2017-2-1','2017-2-2','2017-2-3','hello world!','2017-2-5','2017-2-6']

In [36]: t3 = pd.to_datetime(date3, errors = 'ignore')

In [37]: t4 = pd.to_datetime(date3, errors = 'coerce')

In [38]: t5 = pd.to_datetime(date3) # 报错

In [39]: print(t3, type(t3))
Index(['2017-2-1', '2017-2-2', '2017-2-3', 'hello world!', '2017-2-5',
       '2017-2-6'],
      dtype='object') <class 'pandas.core.indexes.base.Index'>

In [40]: print(t4, type(t4))
DatetimeIndex(['2017-02-01', '2017-02-02', '2017-02-03', 'NaT', '2017-02-05',
               '2017-02-06'],
              dtype='datetime64[ns]', freq=None) <class 'pandas.core.indexes.datetimes.DatetimeIndex'>
  • pd.DatetimeIndex()
In 

2 生成日期范围:pd.date_range

pd.date_range(start=None, end=None, periods=None, freq='D', tz=None, normalize=False, name=None, closed=None)

start 、 end 、 freq

1.通过start-end 与 start/end-periods生成

In 

2. normalize使时间正则化到0:00:00,name是索引对象名称

In 

3.区间closed

  • 'None' 左闭右闭
  • 'left' 左闭右开
  • 'right' 左开右闭
In 

4. 直接转为list,元素为timestamp

In 

5. 生成时间序列

  • DatetimeIndex作为索引
In [115]: rng
Out[115]:
DatetimeIndex(['2017-12-01', '2017-12-02', '2017-12-03', '2017-12-04',
               '2017-12-05'],
              dtype='datetime64[ns]', freq=None)

In [116]: st = pd.Series(np.random.rand(len(rng)),index = rng)

In [117]: print(st,type(st))
2017-12-01    0.757929
2017-12-02    0.392926
2017-12-03    0.192349
2017-12-04    0.238323
2017-12-05    0.297794
dtype: float64 <class 'pandas.core.series.Series'>

In [118]: print(st.index)
DatetimeIndex(['2017-12-01', '2017-12-02', '2017-12-03', '2017-12-04',
               '2017-12-05'],
              dtype='datetime64[ns]', freq=None)

3 生成日期范围的频率调整:freq

默认左闭右闭

1.日分秒

  • 默认freq = 'D' 每日历日,'7D' 每七天
  • B 每工作日; H 每小时(只到end的0:00:00); T/MIN 每分;S 每秒
  • '2h30min' 每两个半小时
  • L 每毫秒(千分之一秒); U每微秒(百万分之一秒)
# 默认
In [25]: print(pd.date_range('20170101','20170104'))
DatetimeIndex(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04'], dtype='datetime64[ns]', freq='D')

# 工作日
In [26]: print(pd.date_range('20170101','20170104',freq = 'B'))
DatetimeIndex(['2017-01-02', '2017-01-03', '2017-01-04'], dtype='datetime64[ns]', freq='B')

# 时
In [28]: print(pd.date_range('20170101','20170102',freq = 'H'))
DatetimeIndex(['2017-01-01 00:00:00', '2017-01-01 01:00:00',
               '2017-01-01 02:00:00', '2017-01-01 03:00:00',
               '2017-01-01 04:00:00', '2017-01-01 05:00:00',
               '2017-01-01 06:00:00', '2017-01-01 07:00:00',
               '2017-01-01 08:00:00', '2017-01-01 09:00:00',
               '2017-01-01 10:00:00', '2017-01-01 11:00:00',
               '2017-01-01 12:00:00', '2017-01-01 13:00:00',
               '2017-01-01 14:00:00', '2017-01-01 15:00:00',
               '2017-01-01 16:00:00', '2017-01-01 17:00:00',
               '2017-01-01 18:00:00', '2017-01-01 19:00:00',
               '2017-01-01 20:00:00', '2017-01-01 21:00:00',
               '2017-01-01 22:00:00', '2017-01-01 23:00:00',
               '2017-01-02 00:00:00'],
              dtype='datetime64[ns]', freq='H')

# 分
In [29]: print(pd.date_range('2017/1/1 12:00','2017/1/1 12:10',freq = 'T'))
    ...:
DatetimeIndex(['2017-01-01 12:00:00', '2017-01-01 12:01:00',
               '2017-01-01 12:02:00', '2017-01-01 12:03:00',
               '2017-01-01 12:04:00', '2017-01-01 12:05:00',
               '2017-01-01 12:06:00', '2017-01-01 12:07:00',
               '2017-01-01 12:08:00', '2017-01-01 12:09:00',
               '2017-01-01 12:10:00'],
              dtype='datetime64[ns]', freq='T')

# 七天
In [54]: print(pd.date_range('2017/1/1','2017/2/1',freq = '7D'))
DatetimeIndex(['2017-01-01', '2017-01-08', '2017-01-15', '2017-01-22',
               '2017-01-29'],
              dtype='datetime64[ns]', freq='7D')

2. 工作日频率:pd.bdate_range()、 freq ='B'

In [35]: print(pd.bdate_range('20170101','20170107'))
DatetimeIndex(['2017-01-02', '2017-01-03', '2017-01-04', '2017-01-05',
               '2017-01-06'],
              dtype='datetime64[ns]', freq='B')

In [36]: print(pd.date_range('20170101','20170107',freq = 'B'))
DatetimeIndex(['2017-01-02', '2017-01-03', '2017-01-04', '2017-01-05',
               '2017-01-06'],
              dtype='datetime64[ns]', freq='B') 

3. 星期x对应的日期

  • 星期x的缩写:MON/TUE/WED/THU/FRI/SAT/SUN
  • 'W-MON' 从星期一开始算起,输出每周的星期一对应的日期
In [32]: print(pd.date_range('20170101','20170201', freq = 'W-MON'))
DatetimeIndex(['2017-01-02', '2017-01-09', '2017-01-16', '2017-01-23',
               '2017-01-30'],
              dtype='datetime64[ns]', freq='W-MON')
  • 'WOM-2MON' 从某月的第2个星期一开始算,输出每月第二个星期一对应的日期;WOM-MON报错
In [34]: print(pd.date_range('20170101','20170501', freq = 'WOM-3MON'))
DatetimeIndex(['2017-01-16', '2017-02-20', '2017-03-20', '2017-04-17'], dtype='datetime64[ns]', freq='WOM-3MON')

虽然左闭右闭,但不输出end那一年的(因为没有)

4. 输出月最后一日

月缩写:JAN/FEB/MAR/APR/MAY/JUN/JUL/AUG/SEP/OCT/NOV/DEC

  • 日历日
    • 'M' 输出每月最后一个日历日,'2M' 每两个月最后一个日历日
    • 'Q-月' 输出每年每个季度末最后一月的最后一个日历日:只有1-4-7-10、2-5-8-11、3-6-9-12
    • 'A-月' 输出每年指定月份的最后一个日历日
In 
  • 工作日
    • 'BM' 输出每月最后一个工作日
    • 'BQ-月' 输出每年每个季度末最后一月的最后一个工作日:只有1-4-7-10、2-5-8-11、3-6-9-12
    • 'BA-月' 输出每年指定月份的最后一个工作日

5. 输出每月第一日

左闭右闭,1月1号有的

  • 日历日
    • 'MS' 输出每月第一个日历日
    • 'QS-月' 输出每年每个季度末最后一月的第一个日历日:只有1-4-7-10、2-5-8-11、3-6-9-12
    • 'AS-月' 输出每年指定月份的第一个日历日
  • 工作日
    • 'BMS' 输出每月第一个工作日
    • 'BQS-月' 输出每年每个季度末最后一月的第一个工作日:只有1-4-7-10、2-5-8-11、3-6-9-12
    • 'BAS-月' 输出每年指定月份的第一个工作日
In 

pandas的时期:period

1.创建时期:pd.Period('输入') 精确度到秒,大写Period

  • 输入年:输出该一整年; 单位是年,加减针对年份;
In [66]: y = pd.Period('2016')

In [67]: y
Out[67]: Period('2016', 'A-DEC')

In [68]: y.start_time
Out[68]: Timestamp('2016-01-01 00:00:00')

In [69]: y.end_time
Out[69]: Timestamp('2016-12-31 23:59:59.999999999')

In [77]: (y+1).start_time
Out[77]: Timestamp('2017-01-01 00:00:00')
  • 输入年月:输出该一整个月;单位是月,加减针对月份
In [70]: m = pd.Period('2019-01')

In [71]: m
Out[71]: Period('2019-01', 'M')

In [72]: print(m)
2019-01

In [73]: m.start_time
Out[73]: Timestamp('2019-01-01 00:00:00')

In [74]: m.end_time
Out[74]: Timestamp('2019-01-31 23:59:59.999999999')

In [78]: m+1
Out[78]: Period('2019-02', 'M')
  • 输入年月日:输出该一天; 单位是日,加减针对日
In [80]: d = pd.Period('2019/2/12')

In [81]: d
Out[81]: Period('2019-02-12', 'D')

In [82]: d.start_time
Out[82]: Timestamp('2019-02-12 00:00:00')

In [83]: d.end_time
Out[83]: Timestamp('2019-02-12 23:59:59.999999999')

In [84]: d+1
Out[84]: Period('2019-02-13', 'D')
  • 输入年月日时:输出该一小时;单位是时,加减针对时
In [87]: h = pd.Period('2019-02-13 23')

In [88]: h
Out[88]: Period('2019-02-13 23:00', 'H')

In [89]: h.start_time
Out[89]: Timestamp('2019-02-13 23:00:00')

In [90]: h.end_time
Out[90]: Timestamp('2019-02-13 23:59:59.999999999')
  • freq参数
    • D、A-月份、Q、Q-月份…
    • 例如,输入年月日时分秒,想调整为单位为时
    • 例如输入年,默认freq是'A-DEC',修改成'A-NOV' 则是输出去年12月到今年11月
# 例1
In [91]: h = pd.Period('2019-2-13 23:09:7')

In [92]: h
Out[92]: Period('2019-02-13 23:09:07', 'S')

In [93]: h = pd.Period('2019-2-13 23:09:7',freq = 'H')

In [94]: h
Out[94]: Period('2019-02-13 23:00', 'H')

# 例2
In [127]: p = pd.Period('2017','A-NOV')

In [128]: p.end_time
Out[128]: Timestamp('2017-11-30 23:59:59.999999999')

In [129]: p.start_time
Out[129]: Timestamp('2016-12-01 00:00:00')
  • 输入季度:输出三个月的;单位是季度,加减针对季度
In [100]: a = pd.Period('2019Q1')

In [101]: b = pd.Period('2019Q1',freq = 'Q-NOV')

In [102]: a
Out[102]: Period('2019Q1', 'Q-DEC')

In [103]: b
Out[103]: Period('2019Q1', 'Q-NOV')

In [104]: a.start_time
Out[104]: Timestamp('2019-01-01 00:00:00')

In [105]: b.start_time
Out[105]: Timestamp('2018-12-01 00:00:00')

In [106]: a.end_time
Out[106]: Timestamp('2019-03-31 23:59:59.999999999')

In [107]: b.end_time
Out[107]: Timestamp('2019-02-28 23:59:59.999999999')

In [108]: a+1
Out[108]: Period('2019Q2', 'Q-DEC')

2. 创建时期范围PeriodIndex:pd.period_range() 小写period

  • 默认左闭右闭
In [112]: prng = pd.period_range('1/1/2011','1/1/2012',freq = 'M')

In [113]: print(prng,type(prng))
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') <class 'pandas.core.indexes.period.PeriodIndex'>

In [114]: print(prng[0],type(prng))
2011-01 <class 'pandas.core.indexes.period.PeriodIndex'>

3. 生成时间序列

  • PeriodIndex作为索引
In [119]: prng
Out[119]:
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 [120]: ts = pd.Series(np.random.rand(len(prng)),index = prng)

In [121]: print(ts,type(ts))
2011-01    0.261200
2011-02    0.610385
2011-03    0.051124
2011-04    0.859731
2011-05    0.267941
2011-06    0.162188
2011-07    0.705975
2011-08    0.972113
2011-09    0.364180
2011-10    0.643569
2011-11    0.880400
2011-12    0.797920
2012-01    0.216660
Freq: M, dtype: float64 <class 'pandas.core.series.Series'>

4. 频率转换:asfreq,参数how

  • how 默认= 'end' ;'start'/'s' 'end'/'e'
  • 例如输入年(freq是'A-DEC'),想改成输入年月(freq是'M')
In [156]: p = pd.Period('2017')

In [157]: p
Out[157]: Period('2017', 'A-DEC')

In [158]: p.asfreq('M')
Out[158]: Period('2017-12', 'M')

In [177]: p.asfreq('M',how = 's')
Out[177]: Period('2017-01', 'M')
  • asfreq与参数freq的不同
# freq
In [169]:  prng = pd.period_range('2017','2018',freq = 'D')
     ...:  ts1 = pd.Series(np.random.rand(len(prng)), index = prng)

In [170]: print(ts1)
2017-01-01    0.660063
2017-01-02    0.740546
2017-01-03    0.151273
2017-01-04    0.516786
2017-01-05    0.649403
                ...
2017-12-28    0.278588
2017-12-29    0.931156
2017-12-30    0.810954
2017-12-31    0.993095
2018-01-01    0.875567
Freq: D, Length: 366, dtype: float64

# asfreq

In [179]: prng = pd.Period_range('2017','2018',freq='M')

In [183]: print(pd.Series(np.random.rand(len(prng)), index = prng.asfreq('D
     ...: ',how = 's')))
2017-01-01    0.683564
2017-02-01    0.319375
2017-03-01    0.528540
2017-04-01    0.168152
2017-05-01    0.202154
2017-06-01    0.112052
2017-07-01    0.593580
2017-08-01    0.280926
2017-09-01    0.210957
2017-10-01    0.531630
2017-11-01    0.411702
2017-12-01    0.309302
2018-01-01    0.395721
Freq: D, dtype: float64
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值