Pandas时间序列与日期
一、时间构造函数
1.1 pandas构造时间的函数
pandas 中的 datetime() 与 python 的 datetime 模块使用方法是一致的。
now = datetime.datetime.now()
type(now)
>>输出结果:
datetime.datetime
now1 = pd.datetime.now()
type(now1)
>>输出结果:
datetime.datetime
now.date()
>>输出结果:
datetime.date(2022, 5, 5)
now.time()
>>输出结果:
datetime.time(17, 14, 28, 930559)
now.hour, now.day, now.year, now.month, now.second
>>输出结果:
(17, 5, 2022, 5, 28)
now.strftime('%Y-%m/%d')
>>输出结果:
'2022-05/05'
1.2 时间戳 pd.Timestamp 和时间段 pd.Period
-
时间戳是最基本的时间序列数据,用于把数值与时点关联在一起。Pandas对象通过时间戳调用时点数据。不过,大多数情况下,用时间段改变时间变量更合适。Period 表示的时间段更直观,还可以用日期时间格式的字符串进行推断。
-
时间戳和时间段都可以与整数做加减运算,以freq指定的参数为单位,freq参数的可选字符串:
别名 | 偏移量类型 | 说明 |
---|---|---|
D | Day | 每日历日 |
B | BusinessDay | 每工作日 |
H | Hour | 每小时 |
T或min | Minute | 每分 |
S | Second | 每秒 |
L或ms | Milli | 每毫秒(即每千分之一秒) |
U | Micro | 每微秒(即每百万分之一秒) |
M | MonthEnd | 每月最后一个日历日 |
BM | BusinessMonthEnd | 每月最后一个工作日 |
MS | MonthBegin | 每月第一个日历日 |
BMS | BusinessMonthBegin | 每月第一个工作日 |
ts = pd.Timestamp('2022-01-01 11:13:19', freq='H')
>>输出结果:
Timestamp('2022-01-01 11:13:19', freq='H')
ts + 1
>>输出结果:
Timestamp('2022-01-01 12:13:19', freq='H')
ts1 = pd.Period('2011-01-01 11:13:19', freq='D')
>>输出结果:
Period('2011-01-01', 'D')
ts1 + 1
>>输出结果:
Period('2011-01-02', 'D')
- Timestamp 与 Period 可以用作索引。作为索引的 Timestamp 与 Period 列表会被强制转换为对应的 DatetimeIndex 与 PeriodIndex。
date = [pd.Timestamp('2015-05-01'), pd.Timestamp('2012-05-02'), pd.Timestamp('2012-05-03')]
ts = pd.Series(np.random.randn(3), index=date)
>>输出结果:
2015-05-01 0.388782
2012-05-02 -0.994027
2012-05-03 1.043194
dtype: float64
ts.index
>>输出结果:
DatetimeIndex(['2015-05-01', '2012-05-02', '2012-05-03'], dtype='datetime64[ns]', freq=None)
date1 = [pd.Period('2015-05-01'), pd.Period('2012-05-02'), pd.Period('2012-05-03')]
ts1 = pd.Series(np.random.randn(3), index=date1)
>>输出结果:
2015-05-01 1.616632
2012-05-02 -1.601359
2012-05-03 -1.353825
Freq: D, dtype: float64
ts1.index
>>输出结果:
PeriodIndex(['2015-05-01', '2012-05-02', '2012-05-03'], dtype='period[D]', freq='D')
1.3 构造时间序列date_range、bdate_range()
- 在实际工作中,经常要生成含大量时间戳的超长索引,如果一个一个输入时间戳会很低效
- 如果时间戳是定频的,用 date_range() 与 bdate_range() 函数即可创 DatetimeIndex
- date_range 默认的频率是日历日,bdate_range 的默认频率是工作日
# start:开始时间,end:结束时间,freq:生成时间间隔频率,name:时间序列的名称
pd.date_range(start='2008-01-01', end='2020-01-01', freq='2Y', name='时间')
>>输出结果:
DatetimeIndex(['2008-12-31', '2010-12-31', '2012-12-31', '2014-12-31', '2016-12-31', '2018-12-31'], dtype='datetime64[ns]', name='时间', freq='2A-DEC')
pd.bdate_range(start='2022-02-01', end='2022-02-16', freq='2B')
>>输出结果:
DatetimeIndex(['2022-02-01', '2022-02-03', '2022-02-07', '2022-02-09', '2022-02-11', '2022-02-15'], dtype='datetime64[ns]', freq='2B')
# periods:生成时间索引的数量
pd.bdate_range(start='2022-02-16' ,periods=5, freq='2B')
>>输出结果:
DatetimeIndex(['2022-02-16', '2022-02-18', '2022-02-22', '2022-02-24', '2022-02-28'], dtype='datetime64[ns]', freq='2B')
二、转换时间戳
2.1 to_datetime()
to_datetime:用于转换时间字符串
、纪元式及混合的日期
、Series或日期列表
df = pd.DataFrame(pd.Series(data=['2005/11/23',
'2010.12.31',
'Jul, 31, 2009',
'2010-01-10',
'Aug-24-2019',
'Feb 1 2020',
'01-14-2012',
None], name='时间'))
df['value'] = np.random.randint(0, 100, size=8)
>>输出结果:
时间 value
0 2005/11/23 24
1 2010.12.31 12
2 Jul,31,2009 15
3 2010-01-10 55
4 Aug-24-2019 67
5 Feb 1 2020 5
6 01-14-2012 59
7 None 74
# 时间类型的字符串,可以直接用to_datetime函数转换成Timestamp类型,并且空值会自动被解析成NaT(时间空值)
df['时间'] =