pandas_时间戳处理

pd.Timestamp

# -*- coding:utf-8 -*- 
import pandas as pd 
import numpy as np 
import pytz
from pandas.tseries.offsets import Day
from pandas.tseries.offsets import DateOffset

# 构造Timestamp时间戳
datetime = pd.Timestamp('20190627 19:00:00')

# 转换字符串
datetime.strftime('%Y%m%d %H:%M:%S')

# 生成现在时间戳
now = pd.Timestamp.now()

# 以日期形式显示
now_date = now.date()

# 转换指定时区时间
now_shanghai = now.tz_localize("Asia/Shanghai")

# 时区本地化
now = now.tz_localize('UTC')

# 所有时区表示
all_localize = pytz.common_timezones

# 转换为时期
date = datetime.to_period(freq='D')

# 转换到日单位,其他清0
date = datetime.to_period(freq='D').start_time

# 偏移
date_add_1 = date + Day(1)
date_add_2 = date + DateOffset(months=4, days=5)

pd.Period

# 构造时期
pdt = pd.Period('20190627 19:00:00',freq='D')

# 时期的首末
pdt.start_time
pdt.end_time

# 生成现在时期
now_pdt = pd.Period.now(freq="D")

pd.Timedelta

# 构造时间间隔
td = pd.Timedelta(weeks=2,days=10,hours=12,minutes=2.4,seconds=10.3)

# 偏移
date_add_1 = date + pd.Timedelta(days=1)

生成时间序列

# 生成时间序列,DatetimeIndex
date_ls = pd.date_range(start='6/1/2019',periods=20,freq='D',normalize=True)

# 生成时期序列,PeriodIndex
prd_ls = pd.period_range(end='6/20/2019',periods=20,freq='D')

时间类型转换

# 字符串列转换时间序列
se = pd.Series(['20190601','20190602','20190603'])
se1 = se.astype(np.datetime64)
se2 = se.map(lambda x:pd.Period(x,freq='D').start_time)
se3 = pd.Series(pd.DatetimeIndex(se)) #生产时间索引
print(se1,'\n---\n',se2,'\n---\n',se3)

# 数值列表转换时间列表
se = pd.Series([20190601,20190602,20190603])
se1 = se.astype(np.str).astype(np.datetime64)
se2 = pd.Series(pd.DatetimeIndex(se.astype(np.str))) #生产时间索引
print(se1,'\n---\n',se2)

时间运算

now = pd.Timestamp.now()+Day(1)
date = now.date()

print(now,type(now))
print(date,type(date),'\n')

# pd.Timedelta
ret1 = now+pd.Timedelta(days=1) # return Timedelta
ret2 = now+pd.Timedelta(weeks=1) # return datetime.date
print(ret1,type(ret1))
print(ret2,type(ret2),'\n')

# offsets
ret1 = now+Day(1) # return Timedelta
ret2 = now+Week(1) # return Timedelta
ret3 = now+MonthEnd(-2) # return Timedelta
print(ret1,type(ret1))
print(ret2,type(ret2))
print(ret3,type(ret3),'\n')

时间函数

# -*- coding:utf-8 -*-
import numpy as np 
import pandas as pd 
from pandas.tseries.offsets import Day,MonthEnd,Week,Nano,Hour



class TimeSel:
    def __init__(self):
        self.start=self.end=''


    def __del__(self):
        pass
        # print('结束时',self.start,self.end)


    # ---取时间标签
    def get_day(self,tval,shift=0):
        tval = pd.Timestamp(tval)
        return (tval+Day(shift)).date()


    def get_week(self,tval,shift=0):
        tval = pd.Timestamp(tval)

        per = pd.Period(tval,freq='Y')
        week_starts = pd.date_range(per.start_time, per.end_time, freq='W-MON')

        ref = tval+Day(shift*7)

        difs = [(week_start,ref-week_start) for week_start in week_starts if week_start<=ref]
        difs.sort(key=lambda x:x[1])

        start = difs[0][0].strftime('%Y%m%d')[2:]
        end = (difs[0][0]+Day(7)-Nano(1)).strftime('%Y%m%d')[2:]

        return '%s-%s'%(start,end)


    def get_mon(self,tval,shift=0):
        tval = pd.Timestamp(tval)

        per = pd.Period(tval,freq='M')+MonthEnd(shift)
        return (per.start_time+MonthEnd(shift)).strftime('%m')


    def get_year(self,tval,shift=0):
        tval = pd.Timestamp(tval)

        per = pd.Period(tval,freq='Y')
        return per.start_time.strftime('%Y')


    # ---过滤表的时间范围
    def set_scope(self,start,end):
        self.start = start
        self.end = end


    def sel_day(self,df,col,shift=0,tval=None):
        per = pd.Period.now(freq='D')+Day(shift)

        if tval:
            tval = pd.Timestamp(tval)
            per = pd.Period(tval,freq='D')+Day(shift)

        self.set_scope(per.start_time,per.end_time)
        return df[(df[col]>=self.start) & (df[col]<=self.end)]


    def sel_week(self,df,col,shift=0,tval=None):
        per = pd.Period.now(freq='Y')
        ref = pd.Period.now(freq='D').start_time+Day(shift*7)

        if tval:
            tval = pd.Timestamp(tval)
            per = pd.Period(tval,freq='Y')
            ref = pd.Period(tval,freq='D').start_time+Day(shift*7)

        week_starts = pd.date_range(per.start_time, per.end_time, freq='W-MON')

        difs = [(week_start,abs(ref-week_start)) for week_start in week_starts]
        difs.sort(key=lambda x:x[1])
        self.set_scope(difs[0][0],difs[0][0]+Day(7)-Nano(1))
        return df[(df[col]>=self.start) & (df[col]<=self.end)]


    def sel_mon(self,df,col,shift=0,tval=None):
        per = pd.Period.now(freq='M')+MonthEnd(shift)

        if tval:
            tval = pd.Timestamp(tval)
            per = pd.Period(tval,freq='M')+MonthEnd(shift)

        self.set_scope(per.start_time,per.end_time)
        return df[(df[col]>=self.start) & (df[col]<=self.end)]



tsel = TimeSel()



if __name__=='__main__':
    print(tsel.get_day('2019-10-01'))
    print(tsel.get_week('2019-10-01',1))
    print(tsel.get_mon('2019-10-01'))
    print(tsel.get_year('2019-10-01'))
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值