文章目录
一、datetime库
datetime库中有以下几种类型:
from datetime import datetime
from datetime import timedelta
1. 字符串与datetime相互转换
datetime转换为字符串:
stamp = datetime(2022, 4, 8)
str(stamp) # 结果:'2022-04-08 00:00:00'
stamp.strftime('%Y-%m-%d') # 结果:'2022-04-08'
将字符串转化为datetime:
datetime.strptime
是在已知格式的情况下转换日期的好方式:
s = '2022-04-09'
datetime.strptime(s, '%Y-%m-%d') # 结果:datetime.datetime(2022, 4, 9, 0, 0)
每次都必须编写一个格式代码可能有点烦人,特别是对于通用日期格式。在这种情况下,你可以使用第三方dateutil包的parser.parse
方法(这个包在安装pandas时已经自动安装,所以不需额外安装):
from dateutil.parser import parse
s = '2022-04-09'
parse(s) # 结果:datetime.datetime(2022, 4, 9, 0, 0)
dateutil能够解析大部分人类可理解的日期表示:
parse('Jan 31, 2022 10:45 PM') # 结果:datetime.datetime(2022, 1, 31, 22, 45)
如果日期出现在月份之前,可以传递dayfirst=True
来表明这种情况:
parse('9/4/2022', dayfirst=True) # 结果:datetime.datetime(2022, 4, 9, 0, 0)
二、pandas中的时间序列数据
1. to_datetime方法
pandas中的to_datetime
方法可以转换很多不同的日期表示格式:
s = '2022-04-09'
pd.to_datetime(s) # 结果:Timestamp('2022-04-09 00:00:00')
同时转换多个日期,即传入列表(datetime.strptime
和parse
不能):
dates = ['2022-04-01', '2022-04-03','2022-04-05','2022-04-07','2022-04-09']
pd.to_datetime(dates) # 结果:DatetimeIndex(['2022-04-01', '2022-04-03', '2022-04-05', '2022-04-07', '2022-04-09'], dtype='datetime64[ns]', freq=None)
to_datetime
方法生成的是Timestamp
对象。
同样的,也可以传递dayfirst=True
。
另外,to_datetime
方法还可以处理那些被认为是缺失值的值:
dt = ['2022-04-09', '2022-04-10', None]
pd.to_datetime(dt) # 结果:DatetimeIndex(['2022-04-09', '2022-04-10', 'NaT'], dtype='datetime64[ns]', freq=None)
其中,NaT
(Not a time)是pandas中时间戳数据的是null值。
2. 作为索引
时间序列数据可作为series和dataframe的索引,以Series为例。
2.1 短的序列
dates = pd.to_datetime(['2022-04-01', '2022-04-03','2022-04-05','2022-04-07','2022-04-09'])
ds = pd.Series(np.random.uniform(0, 1, 5), index=dates)
ds:
2022-04-01 0.089425
2022-04-03 0.917701
2022-04-05 0.222676
2022-04-07 0.450355
2022-04-09 0.125723
dtype: float64
- 可以像普通的Series一样进行选择:
ds[1] # 结果:0.9177005610779598
- 也可以传入相应的时间序列数据:
ds['2022-04-03'] # 结果:0.9177005610779598
- 还可以传递一个能解释为日期的字符串:
ds['2022/04/03'] # 结果:0.9177005610779598
2.2 长的序列
longer_ds = pd.Series(data=np.random.uniform(0, 1, 1000), index=pd.date_range('2022-01-01', periods=1000))
longer_ds:
2022-01-01 0.807610
2022-01-02 0.559262
2022-01-03 0.216209
2022-01-04 0.577930
2022-01-05 0.674460
...
2024-09-22 0.407143
2024-09-23 0.730174
2024-09-24 0.803955
2024-09-25 0.647067
2024-09-26 0.338940
Freq: D, Length: 1000, dtype: float64
- 可以传递一个年份来选择数据:
longer_ds['2022']
输出结果:
2022-01-01 0.807610
2022-01-02 0.559262