日期时间变量的处理

日期时间变量的处理

一、时间戳Timestame对象

二、获取当前时间

三、时间戳实例的属性和方法

四、计算时差Timedelta实例

五、生成时间戳范围

六、数据框内对时间变量的操作

七、滞后一期和先导一期

八、日期时间变量做数据框的索引

一、时间戳Timestame对象

日期时间变量的处理_第1张图片

#导入相关库 
import pandas as pd 
import numpy as np 
import time 
import datetime

#生成时间戳有如下两种方法 
#pd.Timestamp()方法
# 传入一个字符
pd.Timestamp('2017-01-02T12')
# 传入一个值
pd.Timestamp(1,unit='s') # 1秒的时间,这是0时区的时间
# 传入多个日期元素
pd.Timestamp(2017,1,1) 
#传入一个datetime实例 
pd.Timestamp(pd.datetime(2014,1,1)) 

#pd.to_datetime()方法
# 传入字符串
pd.to_datetime('2019/08/28',format='%Y/%m/%d',errors='coerce')  #errors有raise,ignore,coerce 
# 传入数值
pd.to_datetime(1,unit='s')  # 返回0时区的时间,不能返回其他区的时间
# 传入一个datetime实例
pd.to_datetime(pd.datetime(2019,8,28)) 

二、获取当前时间

# 方法1
pd.datetime.now() #返回 datetime.datetime(2019, 8, 28, 15, 31, 35, 897505)
# 方法2
datetime.datetime.now() # 返回 datetime.datetime(2019, 8, 28, 15, 33, 44, 77605)
# 方法3 
time.localtime()  # 返回一个时间元组,time.struct_time(tm_year=2019, tm_mon=8, tm_mday=28, tm_hour=15, tm_min=34, tm_sec=10, tm_wday=2, tm_yday=240, tm_isdst=0)

datetime.datetime.now().timetuple()  #datetime变为struct_time 

三、时间戳实例的属性和方法

a=pd.Timestamp("1970/1/1T00:01:20") 
a.year         #调取年 1970 
a.month        #调取月 1 
a.day          #调取日 1 
a.hour         #调取时间里面的小时 
a.minute       #调取时间里面的分1 
a.second       #调取时间里面的秒20 
a.dayofweek    #调取星期几 返回数值
a.date()       #日期调出来 
a.time()       #时间调出来 
a.timestamp()  #返回距离纪元的秒数 
a.value        #返回距离纪元的纳秒数
a.strftime("%m/%d/%Y")  #将Timestamp变成指定格式的字符串。 
a.strftime("%A")        # 返回星期几

四、计算时差Timedelta实例

#两个Timestamp对象相减产生时间差 
a=pd.Timestamp("2019/8/28T13:48:00") 
b=pd.Timestamp("2019/8/28T9:48:00") 
d=a-b    
Out[36]:
Timedelta('0 days 04:00:00')
#d时间差对象的类型是Timedelta 
#直接生成一个Timedelta 时间差 
cd=pd.Timedelta(days=1,hours=2,minutes=3,seconds=4,
                milliseconds=5,microseconds=6,nanoseconds=7)          
Out[39]:
Timedelta('1 days 02:03:04.005006')
# 时间差Timedelta实例的属性和方法
cd.total_seconds()
cd.delta
cd.components
cd.components.days         #返回时间差天数
cd.components.seconds      #返回秒数
cd.components.milliseconds #返回毫秒
cd.components.microseconds #返回微秒
cd.components.nanoseconds  #返回纳秒

五、生成时间戳范围

a=pd.date_range('2001-1-1',freq='D',periods=10)
Out[47]:
DatetimeIndex(['2001-01-01', '2001-01-02', '2001-01-03', '2001-01-04',
               '2001-01-05', '2001-01-06', '2001-01-07', '2001-01-08',
               '2001-01-09', '2001-01-10'],
              dtype='datetime64[ns]', freq='D')
#a是一个日期时间序列。 
#你可以根据需要指定频率和期数
a[0] #类型为Timestamp 

六、数据框内对时间变量的操作

#通过导入外部数据的方式获得日期时间变量 
data1=pd.read_excel('D:\CDA数分学习资料\python\数据清洗\pandas\\上证指数日收盘价数据.xls')
data1.head()  # 默认显示5行
data1.info()  # 查看导入表格信息
data1.drop(columns=['index'],inplace=True)  # 删除 index 列

# 日期时期那变量变为距离纪元的总秒数
data1['num']=data1['date'].map(lambda x:x.timestamp())
#把年月日时间变成年月时间
data1['ym']=data1['date'].dt.to_period(freq='m')
# 把多个元素合成一个日期时间变量
data1['date1']=data1.apply(lambda x:pd.Timestamp(x['year'],x['month'],x['day']),axis=1)

# 字符串变量转化为日期时间变量
# 方法1
data1["datestr"].map(lambda x:pd.Timestamp(x)) 
# 方法2
pd.to_datetime(data1["datestr"],                             
               format="%m/%d/%Y",                
               errors="ignore").head() 
# 方法3
data1["datestr"].map(lambda x:pd.to_datetime(x,format="%Y/%m/%d")) 
# 日期时间变量转化为指定格式的字符串变量 
# 方法1  map方法应用较广,实现的功能更强大
data1['datestr']=data1['date'].map(lambda x:x.strftime('%Y/%m/%d'))
# 方法2
data1['datestr1']=data1['date'].dt.strftime('Y%/%m/%d')

#把日期时间变量的各个元素调出来
#方法1 常用方法
data1["date"].dt.year #把年调出来是一个int类型 
data1["date"].dt.month #把月调出来是一个int类型 
data1["date"].dt.day #把日调出来是一个int类型 
data1["date"].dt.date #把时间调出来,是一个object类型 
data1["date"].dt.time #把时间调出来,是一个object类型 
#方法2 
data1["year"]=data1["date"].map(lambda x:x.year) #把年调出来是一个int类型 data1["month"]=data1["date"].map(lambda x:x.month) #把月调出来是一个int类型 data1["day"]=data1["date"].map(lambda x:x.day) #把日调出来是一个int类型 data1["date"].map(lambda x:x.date()) #把时间调出来,是一个object类型 
data1["date"].map(lambda x:x.time()) #把时间调出来,是一个object类型 
# 数值变量转化为日期时间变量 
# 方法1
data1['date2']=pd.to_datetime(data1["num"],unit="s") #将date2转变为日期时间变量
# 方法2 
data1["num"].map(lambda x:pd.to_datetime(x,unit='s')) 
# 方法3 
data1["num"].map(lambda x:pd.Timestamp(x,unit='s')) 

#时间差运算
data1['date']+pd.Timedelta(days=30)  # 在date列每行增加30天

七、滞后一期和先导一期

#求变量的滞后一期 
data1["p"].shift(1) 
#求变量的先导一期 
data1["p"].shift(-1).tail() 

#一阶差分
data2['r1']=data2['p'].map(math.log).diff()

八、日期时间变量做数据框的索引

# 定义索引
data2.index=data2['date']
#下面这几种切片和索引方式都是可以的。 
data1["p"]["2003-1-06"] 
data1["p"]["2003-2"] 
data1["p"]['2003-1-06':'2003-1-10'] 
data1[(data1.index>"2003-1-6") & (data1.index<"2003-1-15")] #布尔索引
# 日期频率的转换
series1=pd.date_range("2003-1-1",freq="D",periods=100)  
data1=pd.DataFrame(np.random.rand(100,2),columns=["x1","x2"])
data1.index=series1

data2=data1.asfreq(freq='5D') # 由高频向低频转化 
data2.asfreq(freq="D") # 由低频向高频转化,会出现很多缺失值

#"pad"是向后填充的方法,处理上面data2缺失值
data2.asfreq(freq="D",method="pad")  

你可能感兴趣的:(Python)