python数据分析中的时间处理(2)

来源:互联网 发布:网络主播瞳孔 编辑:程序博客网 时间:2024/06/07 14:43
本文用到的数据,可以加QQ跟群主获取:
群名称:PYTHONERS-数据
群   号:663468799
学习python和数据分析推荐地方: www.lynda.com  
获取lynda官网会员的方式:http://item.taobao.com/item.htm?id=557746408785
1. time模块我们可以使用time.gmtime()函数将时间转换成更加易读的形式。该函数使用timestamp作为参数,返回struct_time类的一个实例对象。该实例对象可以用来表示当前时间的一些属性。比如: 
  • tm_year:  timestamp的年份
  • tm_mon: timestamp的月份(1-12)
  • tm_mday: timestamp的日期(1-31)
  • tm_hour: 时间戳的小时(0-23)
  • tm_min: 时间戳的分钟(0-59)
例如我们可以通过一下代码获取年:
current_time = time.time()current_struct_time = time.gmtime(current_time)current_year = current_struct_time.tm_year
需要注意的是time模块UTC时间,关于UTC时间,点击这里https://baike.baidu.com/item/协调世界时/787659?fr=aladdin
2. datetime模块
当日期计算量大时,datetime更加好用。比如需要计算时间跨度和不同时区时。
基于datatime类创建一个对象:
date_2017 = datetime.datetime(year=2017, month=12, day=31, hour=11, minute=23, second=12)
或者简化:
date_2017 = datetime.datetime(year=2017, month=12, day=31)
获取当前的UTC时间的datetime对象,可以使用datetime.utcnow()函数,如下:
current_datetime = datetime.datetime.utcnow()
一旦我们创建了一个datetime对象,我们可以使用该对象的以下属性:
  • year:返回年值作为整数。
  • month:返回月值一个整数。
  • day:返回整数值。
  • hour:将小时值返回为整数。
  • minute:返回小数值作为整数。
  • second:返回第二个值作为整数。
  • microsecond:将微秒值作为整数返回

3. 时间的计算
当我们需要对时间进行计算的时候,我们需要用到datetime模块中的timedelta类。
当我们创建timedelta的时候,我们可以指定以下参数:
  • weeks
  • days
  • hours
  • minutes
  • seconds
  • milliseconds
  • microseconds
比如我们希望计算3周和2天后的时间,我们首先创建一个datetime的实例对象:
today = datetime.datetime.now()
然后,我们创建一个timedelta的实例对象,用来表示时间长度;
diff = datetime.timedelta(weeks=3, days=2)
然后,我们计算3周和2天后的时间:
future = today + diff
当然我们也可以计算该时间跨度前的时间:
past = today - diff

4. 时间输出的格式化
datetime对象提供了一个格式化输入时间的方法,datetime.strftime()
格式化日期:
%Y/%y ,%B/%b, %d, %A/%a -- 2015/15 , September/Sep, 25, Sunday/Sun
%c 本地的时间格式 %x 本地时间 %X 本地日期
格式化时间: 
%I/%H 12小时/24小时 %M 分 %S 秒, %p
print(now.strftime("%Y")) # 2016print(now.strftime("%y")) # 16print(now.strftime("%B")) # Septemberprint(now.strftime("%b")) # Sepprint(now.strftime("%d")) # 25print(now.strftime("%A")) # Sundayprint(now.strftime("%a")) # Sunprint(now.strftime("%c")) # 本地时间格式print(now.strftime("%x")) # 本地时间print(now.strftime("%X")) # 本地日期
例子:
datetime.datetime.now().strftime("%I:%M%p on %A %B %d, %Y")
04:07PM on Thursday October 05, 2017
5. 解析日期
正如我们可以将datetime对象格式化输出一样,我们同样可以对一个日期字符串进行解析。
我们可以使用datetime.datetime.strptime()函数转换日期字符串:
  1. 日期字符串(例如"Mar 03, 2010"
  2. 格式字符串(例如"%b %d, %Y"
需要注意的是,strptime()是一个函数,而不是某个对象上调用的方法。 使用方法如下:
格式:
datetime.datetime.strptime(字符串,解析格式)-> 返回一个datetime对象
march3 = datetime.datetime.strptime("Mar 03,2010", "%b%d, %Y")

这样我们可以将一个字符串日期,转换成一个datetime实例对象。strptime()函数一般可以和strftime()函数一起使用。
import datetimemystery_date = datetime.datetime.strptime(mystery_date_formatted_string, "%I:%M%p on %A %B %d, %Y")print(mystery_date.strftime("%I:%M%p on %A %B %d, %Y"))

6. AskReddit数据练习
reddit是一个内容和社区网站,用户可以向具有相似兴趣的人群提交链接,短信和其他类型的内容。
我们将使用的数据,来之2015年之前与AskReddit的前1000名职位数据集,如下:
  • Title:帖子的标题
  • Score:该帖子收到的upvote的数量
  • Time:当帖子出现(时间戳)
  • GoldReddit Gold用户发布了多少帖子
  • NumComs:该帖子收到的评论数
Title
Score
Time
Gold
NumComs
"What's your internet ""white whale"", something you've been searching for years to find with no luck?"
11510
1433213314.0
1
26195
What's your favorite video that is 10 seconds or less?
8656
1434205517
4
8479
What are some interesting tests you can take to find out about yourself?
8480
1443409636.0
1
4055
由于第二行的time是Unix timestamp, 我们无法阅读,需要通过一下函数转换:datetime_obj = datetime.datetime.fromtimestamp(1434205517)
第一步: 读取数据,转换日期
将该数据读入,然后转化成一个list_of_list,代码:
import csvimport datetimeports = scv.reader(open("askreddit_2015.csv"))  # 读取数据将数据保存在一个嵌套列表中for post in posts:        float_time = float(post[2])  # 将time列的数据转换成浮点型        post[2] = datetime.datetime.fromtimestamp(float_time)  # 使用fromtimestamp将浮点数据转换成datetime对象        print(post[2])
2015-06-02 02:48:34 
2015-06-13 14:25:17 
2015-09-28 03:07:16 v
2015-08-21 20:23:43
第二步:统计制定月份个数 
def month_count(i):    count = 0    for row in posts:        if row[2].month == i:            count += 1    print(count)    return countfeb_count = month_count(2)aug_count = month_count(8)