时间模块-Python & Pandas

Python中的时间模块

1 time模块

时间相关的操作,时间有三种表示方式:

  • 时间戳 1970年1月1日00:00:00开始按秒计算的偏移量,即:time.time()
  • 格式化的字符串 2014-11-11 11:11, 即:time.strftime(‘%Y-%m-%d’)
  • 结构化时间 元组包含了:年、日、星期等… time.struct_time 如:time.localtime()
import time

1.1 时间戳

# 返回当前时间的时间戳
time.time()
1533547964.642454

1.2 结构化时间 time.struct_time

# localtime([secs])
# 将一个时间戳转换为当前时区的struct_time。secs参数未提供,则以当前时间为准。
time.localtime()
time.struct_time(tm_year=2018, tm_mon=8, tm_mday=6, tm_hour=17, tm_min=33, tm_sec=18, tm_wday=0, tm_yday=218, tm_isdst=0)
time.localtime(1533547964.642454)
time.struct_time(tm_year=2018, tm_mon=8, tm_mday=6, tm_hour=17, tm_min=32, tm_sec=44, tm_wday=0, tm_yday=218, tm_isdst=0)
t=time.localtime()
t.tm_year
2018

这里写图片描述

# gmtime([secs]) 
# 和localtime()方法类似,gmtime()方法是将一个时间戳转换为UTC时区(0时区)的struct_time
time.gmtime()
time.struct_time(tm_year=2018, tm_mon=8, tm_mday=6, tm_hour=9, tm_min=34, tm_sec=48, tm_wday=0, tm_yday=218, tm_isdst=0)
# mktime(t)
#将一个struct_time转化为时间戳。
print(time.mktime(time.localtime()))
1533548114.0

1.3 格式化字符串

# asctime([t])
# 把一个表示时间的元组或者struct_time表示为这种形式:'Mon Aug  6 17:36:15 2018'。
# 如果没有参数,将会将time.localtime()作为参数传入。
time.asctime()
Mon Aug  6 17:36:15 2018
# ctime([secs])
# 把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式。如果参数未给或者为None的时候,将会默认time.time()为参数。它的作用相当于time.asctime(time.localtime(secs))。
time.ctime()
'Mon Aug  6 17:37:31 2018'
# strftime(format[, t]) : 把一个代表时间的元组或者struct_time(如由time.localtime()和
# time.gmtime()返回)转化为格式化的时间字符串。如果t未指定,将传入time.localtime()。如果元组中任何一个
# 元素越界,ValueError的错误将会被抛出。
time.strftime("%Y-%m-%d %X", time.localtime())
'2018-08-06 17:38:41'
# time.strptime(string[, format])
# 把一个格式化时间字符串转化为struct_time。实际上它和strftime()是逆操作。
time.strptime('2011-05-05 16:37:06', '%Y-%m-%d %X')
time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=16, tm_min=37, tm_sec=6, tm_wday=3, tm_yday=125, tm_isdst=-1)

1.4 时间函数

# sleep(secs)
# 线程推迟指定的时间运行,单位为秒。
# clock()
# 需要注意,clock()在不同的系统上含义不同。
#在UNIX系统上,它返回的是“进程时间”,它是用秒表示的浮点数(时间戳)。
# 而在WINDOWS中,第一次调用,返回的是进程运行的实际时间。而第二次之后的调用是自第一次调用以后到现在的运行时间,即两次时间差。

1.4 总结:三种格式时间转化图

这里写图片描述

2 datetime模块

datetime模块的使用与time基本相同,具体有如下的一些方法:

  1. datetime.date:表示日期的类。常用的属性有year, month, day
  2. datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond
  3. datetime.datetime:表示日期时间
  4. datetime.timedelta:表示时间间隔,即两个时间点之间的长度
  5. timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
  6. strftime(“%Y-%m-%d”)
from datetime import datetime
# 获取当前的时间
now = datetime.now()
now
datetime.datetime(2018, 8, 6, 19, 59, 44, 43008)
delta = datetime(2018,8,6) - datetime(2017,8,6,12,0)
delta
datetime.timedelta(364, 43200)
# 获取相差得天数
delta.days
364
# 剩余得秒数
delta.seconds
43200

2.1时间日期对象转字符串

date = datetime(2018,8,6)
date
datetime.datetime(2018, 8, 6, 0, 0)
# 强制转化成字符串
str(date)
'2018-08-06 00:00:00'
# 格式化转化时间日期类型数据
date.strftime("%Y/%m/%d")
'2018/08/06'

2.2 将字符串转datetime类型

dateStr = ["7/6/2011","8/6/2011"]
[datetime.strptime(x,"%m/%d/%Y") for x in dateStr]
[datetime.datetime(2011, 7, 6, 0, 0), datetime.datetime(2011, 8, 6, 0, 0)]
# 时间日期转化工具
from dateutil.parser import parse
parse("2018-08-06")
datetime.datetime(2018, 8, 6, 0, 0)
parse("06/08/2018",dayfirst=False)  # dayfirst=True  第一组代表日期,否则代表月份
datetime.datetime(2018, 6, 8, 0, 0)
parse("Jan 31 997 10:45 PM")
datetime.datetime(997, 1, 31, 22, 45)

Pandas中得时间日期转化

dateStr
['7/6/2011', '8/6/2011']
date_series = pd.to_datetime(dateStr)
date_series
DatetimeIndex(['2011-07-06', '2011-08-06'], dtype='datetime64[ns]', freq=None)
day.month
7
dateStr
['7/6/2011', '8/6/2011']
newdateStr = dateStr+[None]
idx = pd.to_datetime(newdateStr)
idx
DatetimeIndex(['2011-07-06', '2011-08-06', 'NaT'], dtype='datetime64[ns]', freq=None)
mask = pd.isnull(idx)
mask
array([False, False,  True], dtype=bool)
idx[~mask]
DatetimeIndex(['2011-07-06', '2011-08-06'], dtype='datetime64[ns]', freq=None)

1 将时间日期类型作为Series得index索引

dates = [datetime(2011,1,2),datetime(2011,1,5),datetime(2011,1,7),
        datetime(2011,1,8),datetime(2011,1,10),datetime(2011,1,12)]
ts = Series(np.random.randn(6),index=dates)
ts
2011-01-02    0.114065
2011-01-05   -1.835792
2011-01-07   -2.013275
2011-01-08    0.077955
2011-01-10   -0.855311
2011-01-12   -1.448982
dtype: float64
stamp = ts.index[2]
stamp
Timestamp('2011-01-07 00:00:00')
# 通过时间日期类型得行索引获取对应得value值
ts[stamp]
-2.0132746766333041
ts["1/10/2011"]
-0.85531076292809938
ts["20110110"]
-0.85531076292809938
# pd.date_range(start,periods=n)
# 从start日期开始,往后推n个周期(1天为一个周期)得时间范围
longer_str = Series(np.random.randn(1000),
                    index=pd.date_range("1/1/2000",periods=1000)
                   )
longer_str.head(10)
2000-01-01    0.360722
2000-01-02    0.380163
2000-01-03   -0.247308
2000-01-04   -0.488827
2000-01-05   -0.983483
2000-01-06    0.801973
2000-01-07    0.826445
2000-01-08   -0.430291
2000-01-09   -0.592540
2000-01-10   -0.552809
Freq: D, dtype: float64
# 得到某个时间范围内的value值
longer_str["20000102":"20000107"]
2000-01-02    0.380163
2000-01-03   -0.247308
2000-01-04   -0.488827
2000-01-05   -0.983483
2000-01-06    0.801973
2000-01-07    0.826445
Freq: D, dtype: float64
# 获取某一年的数据
longer_str["2000"].head(10)
2000-01-01    0.360722
2000-01-02    0.380163
2000-01-03   -0.247308
2000-01-04   -0.488827
2000-01-05   -0.983483
2000-01-06    0.801973
2000-01-07    0.826445
2000-01-08   -0.430291
2000-01-09   -0.592540
2000-01-10   -0.552809
Freq: D, dtype: float64
#获取某一月的数据
longer_str["2001-05"].head(10)
2001-05-01   -0.259026
2001-05-02    1.067704
2001-05-03   -0.946345
2001-05-04   -1.004247
2001-05-05   -0.217233
2001-05-06    1.146240
2001-05-07   -1.292064
2001-05-08   -0.611653
2001-05-09   -0.340308
2001-05-10    0.315475
Freq: D, dtype: float64
'''
pd.date_range(start,end,[periods])
start str  开始日期
edn   str  结束日期
periods str 生成时间序列的周期

'''
index = pd.date_range("4/1/2012","6/1/2012")   # start  + end 组合使用
index
DatetimeIndex(['2012-04-01', '2012-04-02', '2012-04-03', '2012-04-04',
               '2012-04-05', '2012-04-06', '2012-04-07', '2012-04-08',
               '2012-04-09', '2012-04-10', '2012-04-11', '2012-04-12',
               '2012-04-13', '2012-04-14', '2012-04-15', '2012-04-16',
               '2012-04-17', '2012-04-18', '2012-04-19', '2012-04-20',
               '2012-04-21', '2012-04-22', '2012-04-23', '2012-04-24',
               '2012-04-25', '2012-04-26', '2012-04-27', '2012-04-28',
               '2012-04-29', '2012-04-30', '2012-05-01', '2012-05-02',
               '2012-05-03', '2012-05-04', '2012-05-05', '2012-05-06',
               '2012-05-07', '2012-05-08', '2012-05-09', '2012-05-10',
               '2012-05-11', '2012-05-12', '2012-05-13', '2012-05-14',
               '2012-05-15', '2012-05-16', '2012-05-17', '2012-05-18',
               '2012-05-19', '2012-05-20', '2012-05-21', '2012-05-22',
               '2012-05-23', '2012-05-24', '2012-05-25', '2012-05-26',
               '2012-05-27', '2012-05-28', '2012-05-29', '2012-05-30',
               '2012-05-31', '2012-06-01'],
              dtype='datetime64[ns]', freq='D')
# start + periods 
pd.date_range("4/1/2012",periods=20)
DatetimeIndex(['2012-04-01', '2012-04-02', '2012-04-03', '2012-04-04',
               '2012-04-05', '2012-04-06', '2012-04-07', '2012-04-08',
               '2012-04-09', '2012-04-10', '2012-04-11', '2012-04-12',
               '2012-04-13', '2012-04-14', '2012-04-15', '2012-04-16',
               '2012-04-17', '2012-04-18', '2012-04-19', '2012-04-20'],
              dtype='datetime64[ns]', freq='D')
time.localtime()
time.struct_time(tm_year=2018, tm_mon=8, tm_mday=6, tm_hour=15, tm_min=10, tm_sec=12, tm_wday=0, tm_yday=218, tm_isdst=0)

dateutil包里 parse 方法

from dateutil.parser import parse 
parse('2018-08-06')
datetime.datetime(2018, 8, 6, 0, 0)
parse('08/06/2018',dayfirst = False)
datetime.datetime(2018, 8, 6, 0, 0)
parse('06/08/2018',dayfirst = True)
datetime.datetime(2018, 8, 6, 0, 0)

猜你喜欢

转载自blog.csdn.net/qq_27171347/article/details/81461062