时间事件日志

时间事件日志

个人时间统计工具。要点:

使用 dida365.com 来作为 GTD 工具
使用特殊格式记录事件类别和花费的时间,如: “[探索发现] 体验 iMac 开发环境 [3h]”
导出数据
分析数据

1. 读取数据

%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.pylab import mpl
mpl.rcParams['font.sans-serif']=['Arial Unicode MS']#指定默认字体
mpl.rcParams['axes.unicode_minus']=False
def _parse_date(dsstr):
    return pd.Timestamp(dsstr).date()

data=pd.read_csv('F:\迅雷下载\pandas课件及源码\pandas_tutor-master\data\dida365.csv',header=3,index_col='Due Date',parse_dates=True)
data

在这里插入图片描述

2.清洗数据

#清洗数据,只过滤出自己感兴趣的事件
df=data[data.Status !=0][['List Name','Title']]
df

在这里插入图片描述

#数据解析

#解析title的一段代码
import re

def parse_tag(value):#解析tag
    m = re.match(r'^(\[(.*?)\])?.*$', value)
    if m and m.group(2):
        return m.group(2)
    else:
        return '其他'

def parse_duration(value):#解析时长
    m = re.match(r'^.+?\[(.*?)([hm]?)\]$', value)
    if m:
        dur = 0
        try:
            dur = float(m.group(1))
        except e:
            print('parse duration error: \n%s' % e)
        if m.group(2) == 'm':
            dur = dur / 60.0
        return dur
    else:
        return 0
    
titles = df['Title']
df['Tag'] = titles.map(parse_tag)
df['Duration'] = titles.map(parse_duration)
df.head()

在这里插入图片描述

3. 数据分析

时间总览
平均每天投资在自己身上的时间是多少?-> 全部时间 / 总天数

end_date - start_date
df['Duration'].sum() 
df['Duration'].sum() / (end_date - start_date).days

精力分配

tag_list = df.groupby(['Tag']).sum()
tag_list['Duration'].plot(kind='pie', figsize=(8, 8), fontsize=16, autopct='%1.2f%%')

专注力
长时间学习某项技能的能力

programming = df[df['Tag'] == '编程']
programming.head()
programming.resample('m', how='sum').to_period(freq='m').plot(kind='bar', figsize=(8, 8), fontsize=16)

连续时间的精力分配
以时间为横轴,查看精力分配。

# 为什么不直接使用 df.pivot()? 因为有重复的行索引,如 2016-05-23
date_tags = df.reset_index().groupby(['Due Date', 'Tag']).sum()
# 以 tag 作为列索引
dates = date_tags.reset_index().pivot(index='Due Date', columns='Tag', values='Duration')
# 补足连续时间,可以看到哪些天没有在学习
full_dates = dates.reindex(pd.date_range(start_date, end_date)).fillna(0)
# 画出柱状图
full_dates.plot(kind='bar', stacked=True, figsize=(16, 8))
full_dates.resample('m', how='sum').to_period('m').plot(kind='bar', stacked=True, figsize=(8, 8))

在这里插入图片描述

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页