【pandas教程】时间的处理

时间序列TimeSries

# 生成时间数据,freq参数指定时间单位:S-秒,M-分,D-天,M-月
rng = pd.date_range('1/1/2012', periods=100, freq='S')
ts = pd.Series(np.random.randint(0, 500, len(rng)), index=rng)
ts.resample('5Min').sum()
# 时区表示
ts_utc = ts.tz_localize('UTC')
ts_utc = ts.tz_localize('US/Eastern')
# 时间格式截断,将日期时间离散化,转换为更粗的粒度,转换为日、月、季度、年
ps = ts.to_period('Y') # 截断为年份,A也可以
ps = ts.to_period('M') # 截断为月份
ps = ts.to_period('D') # 截断为日期
ps = ts.to_period('Q') # 截断为季度
# 指定时间显示格式,将日期时间离散化,转换为更粗的粒度,转换为日、周、月、季度、年
ps = ts.to_period('D').strftime('%Y, %m, %d, %B, %r')
# 周的索引
ts.to_period('D').loc[pd.to_datetime('2022-01-31/2022-02-06')]
# 将日期时间离散化,转换为更细的粒度,例如:日转换为时、分、秒等,假设有时间索引的df
df.asfreq(freq='D',fill_value=0)
df.asfreq(freq='D',method='ffill')
# 时间段转换为时间
ts = ps.to_timestamp()
# 字符串转换为时间,以日期的字符串timestamp为例
df['timestamp'].astype('datetime64') # 仅限时间格式为yyyy-mm-dd
df['timestamp'].astype('datetime64[ns]') # 'datetime64'等同于'datetime64[ns]'
df['timestamp'] = pd.to_datetime(df['timestamp']) # 时间格式为yyyy-mm-dd
df['timestamp'] = pd.to_datetime(df['timestamp'], format='%Y%m%d') # 这里将yyyymmdd格式时间解析为时间类型字段,其他时间格式必需指定format,否则会解析为1970-01-01,

时间索引的特性

import numpy as np
dates=['20220101','20220102','20220103','20220104','20220105']
df = pd.DataFrame(np.random.randn(5), index=[pd.to_datetime(date) for date in dates])
# 时间索引的切片,类似下标索引,等同于使用iloc
df[::2] # 正向步长为2
df[::-2] # 逆向步长为2
df + df[::2] # 对应索引做加法运算
# 时间索引的访问,无法使用键值索引,必需使用loc
df.loc['20220101'] # 日期格式1
df.loc['2022-01-01'] # 日期格式2
df.loc['20220101': '20220103'] # 日期格式1,左闭右闭
df.loc['2022-01-01': '2022-01-03'] #日期格式2,左闭右闭
df.loc['2022'] # 部分日期,按年筛选
df.loc['2022-01'] # 部分日期,按年月筛选,必需加横线
# 时间索引的洞察,查看年月日
df.index.year # 查看时间索引的年份
df.index.month # 查看时间索引的月份
df.index.day # 查看时间索引的日期
df.index.weekofyear # 查看时间索引都是本年的第几周
df.index.weekday # 查看时间索引的星期
# 时间索引的偏移
df['A'].shift(2) # 数据向下偏移2行,头两行值为NaN
df.tshift(2, freq='D') # 时间索引加2天
df.tshift(2, freq='M') # 时间索引加2月,全部时间索引变为隔月月末一天
df.tshift(2, freq='Y') # 时间索引加2年,全部时间索引变为隔年月末一天
# 注意:如果时间列存在重复值,则tshift报错cannot reindex from a duplicate axis,此时必须通过datetime.timedelta完成
import datetime
df.assign(date=lambda x: x['date'].astype('datetime64[ns]').apply(lambda x: x + datetime.timedelta(1)))

# 时间索引的填充
df.asfreq(freq='30S', fill_value=1.0) # 增加时间切片,每个索引之间按照30S生成新的切片,默认值为1.0
df.asfreq(freq='30S', method='bfill') # 增加时间切片,每个索引之间按照30S生成新的切片,默认值向下填充(以下一个非空值为准)

python内置时间模块datetime

# 实例化时间对象,共7个参数,年、月、日、时、分、秒、毫秒
t = datetime.datetime(2022, 2, 5, 9, 30, 15, 0)
# 获取当前时间,获取年、月、日、时、分、秒、毫秒
import datetime
now = datetime.datetime.now()
year= now.year
month = now.month
day = now.day
hour = now.hour
minute = now.minute
second = now.second
microsecond = now.microsecond
# 时间差,与datetime对象不同,仅3个参数,分别为days、seconds、microseconds
import datetime
delta = datetime.timedelta(1,60,0)
tomorrow = now + delta

时间格式转换

代码 说明
%Y 4位数的年
%y 2位数的年
%m 2位数的月[01,12]
%d 2位数的日[01,31]
%H 时(24小时制)[00,23]
%l 时(12小时制)[01,12]
%M 2位数的分[00,59]
%S 秒[00,61]有闰秒的存在
%w 用整数表示的星期几[0(星期天),6]
%F %Y-%m-%d简写形式例如,2017-06-27
%D %m/%d/%y简写形式
# 日期转换为字符串,strftime(string from time)
stamp = datetime(2022, 2, 5)
stamp.strftime('%Y-%m-%d') # '2022-02-05'
# 字符串转换为日期,strptime(string parse to time)
strdate = '2022-02-05'
stamp = datetime.datetime.strptime(strdate, '%Y-%m-%d') # datetime.datetime(2022, 2, 5, 0, 0)

你可能感兴趣的:(pandas数据分析,python,数据分析)