返回顶部
首页 > 资讯 > 精选 >如何使用Jupyter改善时间管理
  • 504
分享到

如何使用Jupyter改善时间管理

2023-06-15 15:06:16 504人浏览 独家记忆
摘要

本篇内容介绍了“如何使用Jupyter改善时间管理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!python 在探索数据方面具有令

本篇内容介绍了“如何使用Jupyter改善时间管理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

python 在探索数据方面具有令人难以置信的可扩展性。利用 pandas 或 Dask,你可以将 Jupyter 扩展到大数据领域。但是小数据、个人资料、私人数据呢?

JupyterLab 和 Jupyter Notebook 为我提供了一个绝佳的环境,可以让我审视我的笔记本电脑生活。

我的探索是基于以下事实:我使用的几乎每个服务都有一个 WEB api。我使用了诸多此类服务:待办事项列表、时间跟踪器、习惯跟踪器等。还有一个几乎每个人都会使用到:日历。相同的思路也可以应用于其他服务,但是日历具有一个很酷的功能:几乎所有 Web 日历都支持的开放标准 —— CalDAV。

在 Jupyter 中使用 Python 解析日历

大多数日历提供了导出为 CalDAV 格式的方法。你可能需要某种身份验证才能访问这些私有数据。按照你的服务说明进行操作即可。如何获得凭据取决于你的服务,但是最终,你应该能够将这些凭据存储在文件中。我将我的凭据存储在根目录下的一个名为 .caldav 的文件中:

import oswith open(os.path.expanduser("~/.caldav")) as fpin:    username, passWord = fpin.read().split()

切勿将用户名和密码直接放在 Jupyter Notebook 的笔记本中!它们可能会很容易因 git push 的错误而导致泄漏。

下一步是使用方便的 PyPI caldav 库。我找到了我的电子邮件服务的 CalDAV 服务器(你可能有所不同):

import caldavclient = caldav.DAVClient(url="https://caldav.fastmail.com/dav/", username=username, password=password)

CalDAV 有一个称为 principal(主键)的概念。它是什么并不重要,只要知道它是你用来访问日历的东西就行了:

principal = client.principal()calendars = principal.calendars()

从字面上讲,日历就是关于时间的。访问事件之前,你需要确定一个时间范围。默认一星期就好:

from dateutil import tzimport datetimenow = datetime.datetime.now(tz.tzutc())since = now - datetime.timedelta(days=7)

大多数人使用的日历不止一个,并且希望所有事件都在一起出现。itertools.chain.from_iterable 方法使这一过程变得简单:

import itertools raw_events = list(    itertools.chain.from_iterable(        calendar.date_search(start=since, end=now, expand=True)        for calendar in calendars    ))

将所有事件读入内存很重要,以 API 原始的本地格式进行操作是重要的实践。这意味着在调整解析、分析和显示代码时,无需返回到 API 服务刷新数据。

但 “原始” 真的是原始,事件是以特定格式的字符串出现的:

print(raw_events[12].data)
    BEGIN:VCALENDAR    VERSioN:2.0    PRODID:-//CyrusIMAP.org/Cyrus     3.3.0-232-g4bdb081-fm-20200825.002-g4bdb081a//EN    BEGIN:VEVENT    DTEND:20200825T230000Z    DTSTAMP:20200825T181915Z    DTSTART:20200825T220000Z    SUMMARY:Busy    UID:     1302728i-040000008200E00074C5B7101A82E00800000000D939773EA578D601000000000     000000010000000CD71CC3393651B419E9458134FE840F5    END:VEVENT    END:VCALENDAR

幸运的是,PyPI 可以再次使用另一个辅助库 vobject 解围:

import ioimport vobject def parse_event(raw_event):    data = raw_event.data    parsed = vobject.readOne(io.StringIO(data))    contents = parsed.vevent.contents    return contents
parse_event(raw_events[12])
    {'dtend': [<DTEND{}2020-08-25 23:00:00+00:00>],     'dtstamp': [<DTSTAMP{}2020-08-25 18:19:15+00:00>],     'dtstart': [<DTSTART{}2020-08-25 22:00:00+00:00>],     'summary': [<SUMMARY{}Busy>],     'uid': [<UID{}1302728i-040000008200E00074C5B7101A82E00800000000D939773EA578D601000000000000000010000000CD71CC3393651B419E9458134FE840F5>]}

好吧,至少好一点了。

仍有一些工作要做,将其转换为合理的 Python 对象。第一步是 拥有 一个合理的 Python 对象。attrs 库提供了一个不错的开始:

import attrfrom __future__ import annotations@attr.s(auto_attribs=True, frozen=True)class Event:    start: datetime.datetime    end: datetime.datetime    timezone: Any    summary: str

是时候编写转换代码了!

第一个抽象从解析后的字典中获取值,不需要所有的装饰:

def get_piece(contents, name):    return contents[name][0].valueget_piece(_, "dtstart")    datetime.datetime(2020, 8, 25, 22, 0, tzinfo=tzutc())

日历事件总有一个“开始”、有一个“结束”、有一个 “持续时间”。一些谨慎的解析逻辑可以将两者协调为同一个 Python 对象:

def from_calendar_event_and_timezone(event, timezone):    contents = parse_event(event)    start = get_piece(contents, "dtstart")    summary = get_piece(contents, "summary")    try:        end = get_piece(contents, "dtend")    except KeyError:        end = start + get_piece(contents, "duration")    return Event(start=start, end=end, summary=summary, timezone=timezone)

将事件放在 本地 时区而不是 UTC 中很有用,因此使用本地时区:

my_timezone = tz.gettz()from_calendar_event_and_timezone(raw_events[12], my_timezone)    Event(start=datetime.datetime(2020, 8, 25, 22, 0, tzinfo=tzutc()), end=datetime.datetime(2020, 8, 25, 23, 0, tzinfo=tzutc()), timezone=tzfile('/etc/localtime'), summary='Busy')

既然事件是真实的 Python 对象,那么它们实际上应该具有附加信息。幸运的是,可以将方法添加到类中。

但是要弄清楚哪个事件发生在哪一天不是很直接。你需要在 本地 时区中选择一天:

def day(self):    offset = self.timezone.utcoffset(self.start)    fixed = self.start + offset    return fixed.date()Event.day = property(day)
print(_.day)    2020-08-25

事件在内部始终是以“开始”/“结束”的方式表示的,但是持续时间是有用的属性。持续时间也可以添加到现有类中:

def duration(self):    return self.end - self.startEvent.duration = property(duration)
print(_.duration)    1:00:00

现在到了将所有事件转换为有用的 Python 对象了:

all_events = [from_calendar_event_and_timezone(raw_event, my_timezone)              for raw_event in raw_events]

全天事件是一种特例,可能对分析生活没有多大用处。现在,你可以忽略它们:

# ignore all-day eventsall_events = [event for event in all_events if not type(event.start) == datetime.date]

事件具有自然顺序 &mdash;&mdash; 知道哪个事件最先发生可能有助于分析:

all_events.sort(key=lambda ev: ev.start)

现在,事件已排序,可以将它们加载到每天:

import collectionsevents_by_day = collections.defaultdict(list)for event in all_events:    events_by_day[event.day].append(event)

有了这些,你就有了作为 Python 对象的带有日期、持续时间和序列的日历事件。

用 Python 报到你的生活

现在是时候编写报告代码了!带有适当的标题、列表、重要内容以粗体显示等等,有醒目的格式是很意义。

这就是一些 html 和 HTML 模板。我喜欢使用 Chameleon:

template_content = """<html><body><div tal:repeat="item items"><h3 tal:content="item[0]">Day</h3><ul>    <li tal:repeat="event item[1]"><span tal:replace="event">Thing</span></li></ul></div></body></html>"""

Chameleon 的一个很酷的功能是使用它的 html 方法渲染对象。我将以两种方式使用它:

  • 摘要将以粗体显示

  • 对于大多数活动,我都会删除摘要(因为这是我的个人信息)

def __html__(self):    offset = my_timezone.utcoffset(self.start)    fixed = self.start + offset    start_str = str(fixed).split("+")[0]    summary = self.summary    if summary != "Busy":        summary = "&lt;REDACTED&gt;"    return f"<b>{summary[:30]}</b> -- {start_str} ({self.duration})"Event.__html__ = __html__

为了简洁起见,将该报告切成每天的:

import chameleonfrom IPython.display import HTMLtemplate = chameleon.PageTemplate(template_content)html = template(items=itertools.islice(events_by_day.items(), 3, 4))HTML(html)

渲染后,它将看起来像这样:

2020-08-25

  • <REDACTED> -- 2020-08-25 08:30:00 (0:45:00)

  • <REDACTED> -- 2020-08-25 10:00:00 (1:00:00)

  • <REDACTED> -- 2020-08-25 11:30:00 (0:30:00)

  • <REDACTED> -- 2020-08-25 13:00:00 (0:25:00)

  • Busy -- 2020-08-25 15:00:00 (1:00:00)

  • <REDACTED> -- 2020-08-25 15:00:00 (1:00:00)

  • <REDACTED> -- 2020-08-25 19:00:00 (1:00:00)

  • <REDACTED> -- 2020-08-25 19:00:12 (1:00:00)

“如何使用Jupyter改善时间管理”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 如何使用Jupyter改善时间管理

本文链接: https://lsjlt.com/news/280774.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何使用Jupyter改善时间管理
    本篇内容介绍了“如何使用Jupyter改善时间管理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Python 在探索数据方面具有令...
    99+
    2023-06-15
  • 如何改善化工行业运费管理
    一.  化工行业运输管理的特点化工企业的成品、大宗原料在运输方式的选择上,由于环保和安全的考虑,大多是公路运输方式,运输方式的限制导致运输成本较高。有些原材料比如,海盐、煤炭、矿石大都通过火车、专用槽灌车、轮船运输,有时是火车、货...
    99+
    2023-06-05
  • Linux如何管理时间
    这篇文章主要为大家展示了“Linux如何管理时间”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux如何管理时间”这篇文章吧。剪贴板指示器你是否在日常使用中,在多个文档之间的大量使用复制和粘...
    99+
    2023-06-15
  • 使用中间件改善golang函数中的错误处理
    使用中间件改善 go 函数中的错误处理:引入中间件的概念,它可以拦截函数调用并执行特定逻辑。创建错误处理中间件,该中间件将错误处理逻辑包装在自定义函数中。使用中间件包装处理程序函数,以便...
    99+
    2024-04-24
    golang 错误处理 git
  • 如何使用Docker Compose改善Node.js的开发
    这篇文章主要介绍“如何使用Docker Compose改善Node.js的开发”,在日常操作中,相信很多人在如何使用Docker Compose改善Node.js的开发问题上存在疑惑,小编查阅了各式资料,整...
    99+
    2024-04-02
  • 如何使用VSCode Task改善日常工作
    这篇文章主要介绍如何使用VSCode Task改善日常工作,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!我工作过的所有JavaScript项目都有一组定义的脚本,你可以为一个应用程序...
    99+
    2024-04-02
  • 怎么改善应用程序在Linux中的启动时间
    这篇文章给大家分享的是有关怎么改善应用程序在Linux中的启动时间的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在 Linux 中使用 Preload 改善应用程序启动时间Preload 可以在 AUR 上找到。...
    99+
    2023-06-16
  • Node.js 路由与缓存:改善应用程序响应时间
    路由优化 使用快速路由器: Express 或 Fastify 等快速路由器可以处理大量并发的 HTTP 请求,从而减少响应时间。 减少层叠的路由:避免在路由中使用过多的嵌套,因为这会增加查找特定路由所需的时间。 使用路由组:将相关的路...
    99+
    2024-04-02
  • 如何改善应用用户体验
    这篇文章主要讲解了“如何改善应用用户体验”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何改善应用用户体验”吧!1、 请你的兄弟姐妹来测试你的应用然后再随机找10、20或50个人来试用你的应...
    99+
    2023-06-10
  • php时间如何改为时间戳
    本文小编为大家详细介绍“php时间如何改为时间戳”,内容详细,步骤清晰,细节处理妥当,希望这篇“php时间如何改为时间戳”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。将日期时间格式转换为时间戳格式在PHP中,使用...
    99+
    2023-07-05
  • 如何使用Jupyter Notebooks构建一个远程管理控制台
    小编给大家分享一下如何使用Jupyter Notebooks构建一个远程管理控制台,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!SSH 是一个强大的远程管理工具,...
    99+
    2023-06-15
  • Jupyter Notebook如何计算单元的执行时间
    这篇文章主要为大家展示了“Jupyter Notebook如何计算单元的执行时间”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Jupyter Notebook如...
    99+
    2024-04-02
  • ASP缓存和Django函数:如何使用缓存来改善您的Web应用程序的响应时间?
    Web应用程序的响应时间是用户体验的重要组成部分。对于许多Web应用程序来说,缓存是提高响应时间的一种有效方式。在本文中,我们将探讨ASP缓存和Django函数,以及如何使用它们来改善Web应用程序的响应时间。 ASP缓存 ASP缓存是一...
    99+
    2023-06-15
    缓存 django 函数
  • php如何将时间改成时间戳
    这篇文章主要讲解了“php如何将时间改成时间戳”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php如何将时间改成时间戳”吧!一、使用 PHP 内置函数在 PHP 中,有一个内置函数 time...
    99+
    2023-07-05
  • 如何修改mysql时间
    这篇文章主要介绍了如何修改mysql时间,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 方法:1、用“sudo ...
    99+
    2024-04-02
  • linux如何修改时间
    linux中修改时间的方法:1、打开终端;2、输入“timedatectl”命令检查当前是日期和时区设置;3、再输入“timedatectl list-timezones”命令获取时区列表;4、输入“timedatectl list-tim...
    99+
    2024-04-02
  • php如何改变超时时间
    本篇内容主要讲解“php如何改变超时时间”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php如何改变超时时间”吧!下面是一些可以改变 PHP 超时时间的方法:修改 php.ini这是最常见的方式...
    99+
    2023-07-05
  • GO语言开发者必知:容器框架如何改善缓存管理?
    缓存是提高系统性能的一种常见方式,它通过将数据存储在内存中,避免了频繁的磁盘读写操作,从而提高了数据访问的速度。然而,缓存管理对于系统的性能和可靠性来说是一个非常重要的问题。在这方面,容器框架可以帮助开发者解决这些问题。 一、什么是容器框...
    99+
    2023-07-24
    容器 框架 缓存
  • ASP 容器如何改善自然语言处理?
    自然语言处理(Natural Language Processing, NLP)是人工智能领域的重要分支之一。它涉及到对人类语言进行理解、分析和生成,可以应用于文本分类、情感分析、机器翻译等众多领域。在 NLP 中,容器技术越来越受到重视...
    99+
    2023-10-17
    容器 自然语言处理 数据类型
  • navicat如何修改试用期时间
    这篇文章将为大家详细讲解有关navicat如何修改试用期时间,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。LinuxLinux下Navicat是通过脚本启动的,因此很容易...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作