DataWhale7月学习——Python入门

Task8:模块与datetime模块

本节我们初步学习Python语法中的模块与datetime模块。文章给出了一些重点知识的.py程序便于读者深入理解。本文的程序编写基于Python3.0+,安装环境使用的是PyCharm。

模块

模块是一个包含所有定义的函数和变量的文件,其后缀是.py。模块可以被别的程序引入,以使用该模块中的函数等功能,这也是Python标准库的方法。
容器–>数据的封装
函数–>语句的封装
类–>方法和语句的封装
模块–>程序文件

创建模块和命名空间

创建一个hello.py文件

# hello.py
def hi():
   print('Hi everyone, I love lsgogroup!')

命名空间因对象的不同,也有所区别,分为以下几种:
内置命名空间:内置函数的命名空间都属于内置命名空间,可以在任何程序中直接运行它们,比如id()
全局命名空间:每个模块创建它所拥有的全局命名空间,不同模块的全局命名空间彼此独立,不同模块相同名称的命名空间,也会因为模块的不同而不相互打扰
本地命名空间:模块中有函数或者类,每个函数或者类所定义的命名空间就是本地命名空间。如果函数返回了结果或者抛出异常,则本地命名空间也结束了

import hello

hello.hi() # Hi everyone, I love lsgogroup!
hi() # NameError: name 'hi' is not defined

导入模块

创建一个模块TemperatureConversion.py

# TemperatureConversion.py
def c2f(cel):
   fah = cel * 1.8 + 32
   return fah
def f2c(fah):
   cel = (fah - 32) / 1.8
   return cel

1.import 模块名

import TemperatureConversion
print('32摄⽒度 = %.2f华⽒度' % TemperatureConversion.c2f(32))
print('99华⽒度 = %.2f摄⽒度' % TemperatureConversion.f2c(99))
# 32摄⽒度 = 89.60华⽒度
# 99华⽒度 = 37.22摄⽒度

2.from 模块名 import 函数名

from TemperatureConversion import c2f, f2c
print('32摄⽒度 = %.2f华⽒度' % c2f(32))
print('99华⽒度 = %.2f摄⽒度' % f2c(99))
# 32摄⽒度 = 89.60华⽒度
# 99华⽒度 = 37.22摄⽒度
  1. import 模块名 as 新名字
import TemperatureConversion as tc
print('32摄⽒度 = %.2f华⽒度' % tc.c2f(32))
print('99华⽒度 = %.2f摄⽒度' % tc.f2c(99))
# 32摄⽒度 = 89.60华⽒度
# 99华⽒度 = 37.22摄⽒度

if name == ‘main

if name == 'main’的意思是:当.py文件被直接运行时,if name == 'main’之下的代码块将被运行,当.py文件以模块形式被导入时,if name == 'main’之下的代码块将不被运行
假设我们有一个const.py文件

PI = 3.14
def main():
   print("PI:", PI)
main()
# PI: 3.14

写一个用于计算圆面积的area.py文件,需要用到const.py文件中的PI变量。从const.py中把PI变量导入到area.py中:

from const import PI
def calc_round_area(radius):
    return PI * (radius ** 2)
def main():
    print("round area: ", calc_round_area(2))
main()
'''
PI: 3.14
round area: 12.56
'''

可以看到const.py中的main()也运行了,我们不希望它被运行,此时就要用到if name == ‘main’:

PI = 3.14
def main():
   print("PI:", PI)
if __name__ == "__main__":
   main()

__name__是内置变量,可用于当前模块的名字:

import const
print(__name__)
# __main__
print(const.__name__)
# const

包(Package)

包是一种管理Python模块命名空间的形式,采用“点模块名称”
创建包分为三个步骤:
1.创建一个文件夹,用于存放相关模块,文件夹的名字即为包的名字
2.在文件夹中创建一个__init__.py的莫魁岸文件,内容为空
3.将相关文件放入文件夹中
导入一个包时,Python会根据sys.path中的目录来寻找这个包中包含的子目录
目录只有一个包含__init__.py的文件才被认为是一个包(最简单的情况是放一个空的__init__.py)
导入子模块sound.effects.echo:

import sound.effects.echo

必须使用全名取访问:

sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

导入子模块echo:

from sound.effects import echo
echo.echofilter(input, output, delay=0.7, atten=4)

还有一种方法是直接导入一个函数或者变量:

from sound.effects.echo import echofilter
echofilter(input, output, delay=0.7, atten=4)

注意:当使用from package import item这种形式时,对应的item既可以是包里面的子模块(子包),或者包里面其他定义的名称,如函数、类或者变量
导入语句遵循以下规则:如果包定义文件__init__.py存在一个叫做__all__的列表变量,那么在使用from package import *的时候就不会导入sound.effects里任何的子模块,只是把包sound.effects和它里面定义的所有内容导入进来(可能运行__init__.py里定义的初始化代码)

import sound.effects.echo
import sound.effects.surround
from sound.effects import *

上例中,from…import前, 包sound.effects中的echo和surround模块都被导入到当前的命名空间中

datetime模块

datetime模块是Python中处理日期的标准模块,提供了四种对日期和实践处理的类:datetime、date、time和timedelta

datetime类

class datetime(date):
   def __init__(self, year, month, day, hour, minute, second, microsecond, tzinfo)
      pass
   def now(cls, tz=None):
      pass
   def timestamp(self):
      pass
   def fromtimestamp(cls, t, tz=None):
      pass
   def date(self):
      pass
   def time(self):
      pass
   def year(self):
      pass
   def month(self):
      pass
   def day(self):
      pass
   def hour(self):
      pass
   def minute(self):
      pass
   def second(self):
      pass
   def isoweekday(self):
      pass
   def strftime(self, fmt):
      pass
   def combine(cls, date, time, tzinfo=True):
      pass

datetime.now(tz=None)获取当前的日期时间,顺出顺序为:年、月、日、时、分、秒、微秒
datetime.timestamp()获取以1970年1月1日为起点记录的秒数
datetime.fromtimestamp(tz=None)使用unixtimestamp创建一个datetime

创建一个datetime对象

import datetime
dt = datetime.datetime(year=2020, month=6, day=25, hour=11, minute=23, second=59)
print(dt) # 2020-06-25 11:23:59
print(dt.timestamp()) # 1593055439.0
dt = datetime.datetime.fromtimestamp(1593055439.0)
print(dt) # 2020-06-25 11:23:59
print(type(dt)) # <class 'datetime.datetime'>
dt = datetime.datetime.now()
print(dt) # 2020-06-25 11:11:03.877853
print(type(dt)) # <class 'datetime.datetime'>

将datetime对象转换为任何格式的日期

import datetime
dt = datetime.datetime(year=2020, month=6, day=25, hour=11, minute=51, second=49) 
s = dt.strftime("'%Y/%m/%d %H:%M:%S")
print(s) # '2020/06/25 11:51:49
s = dt.strftime('%d %B, %Y, %A')
print(s) # 25 June, 2020, Thursday

将给定日期转换为“mmm-dd,YYYY”的格式

import datetime
d1 = datetime.date(2010, 9, 28)
print(d1.strftime('%b-%d,%Y'))
# Sep-28,2010

datetime对象包含很多与日期时间有关的实用功能

import datetime
dt = datetime.datetime(year=2020, month=6, day=25, hour=11, minute=51, second=49)
print(dt.date()) # 2020-06-25
print(type(dt.date())) # <class 'datetime.date'>
print(dt.time()) # 11:51:49
print(type(dt.time())) # <class 'datetime.time'>
print(dt.year) # 2020
print(dt.month) # 6
print(dt.day) # 25
print(dt.hour) # 11
print(dt.minute) # 51
print(dt.second) # 49
print(dt.isoweekday()) # 4

在处理含有字符串日期的数据集或表格时,使用dateutil中的parser模块自动解析字符串,将其转换为datetime对象
parser.parse(timestr, parserinfo=None, **kwargs)

from dateutil import parser
s = '2020-06-25'
dt = parser.parse(s)
print(dt) # 2020-06-25 00:00:00
print(type(dt)) # <class 'datetime.datetime'>
s = 'March 31, 2010, 10:51pm'
dt = parser.parse(s)
print(dt) # 2010-03-31 22:51:00
print(type(dt)) # <class 'datetime.datetime'>

将字符串日期转换为datetime对象:

from dateutil import parser
s1 = "2010 Jan 1"
s2 = '31-1-2000'
s3 = 'October10, 1996, 10:40pm'
dt1 = parser.parse(s1)
dt2 = parser.parse(s2)
dt3 = parser.parse(s3)
print(dt1) # 2010-01-01 00:00:00
print(dt2) # 2000-01-31 00:00:00
print(dt3) # 1996-10-10 22:40:00

计算下列表中连续的天数:

import numpy as np
from dateutil import parser
dateString = ['Oct, 2, 1869', 'Oct, 10, 1869', 'Oct, 15, 1869', 'Oct, 20, 1869', 'Oct, 23, 1869']
dates = [parser.parse(i) for i in dateString]
td = np.diff(dates)
print(td)
# [datetime.timedelta(days=8) datetime.timedelta(days=5)
# datetime.timedelta(days=5) datetime.timedelta(days=3)]
d = [i.days for i in td]
print(d) # [8, 5, 5, 3]

date类

class date:
   def __init__(self, year, month, day):
       pass
   def today(cls):
       pass

1.date.today()获取当前日期信息

import datetime
d = datetime.date(2020, 6, 25)
print(d) # 2020-06-25
print(type(d)) # <class 'datetime.date'>
d = datetime.date.today()
print(d) # 2020-06-25
print(type(d)) # <class 'datetime.date'>

例:统计两个日期之间有多少个星期六

import datetime
d1 = datetime.date(1869, 1, 2)
d2 = datetime.date(1869, 10, 2)
dt = (d2 - d1).days
print(dt)
print(d1.isoweekday()) # 6
print(dt // 7 + 1) # 40

time类

class time:
   def __init__(self, hour, minute, second, microsecond, tzinfo):
      pass

使用datetime.time()类

import datetime
t = datetime.time(12, 9, 23, 12980)
print(t) # 12:09:23.012980
print(type(t)) # <class 'datetime.time'>

例:将给定日期转换为当天开始的时间

import datetime
date = datetime.date(2019, 10, 2)
dt = datetime.datetime(date.year, date.month, date.day)
print(dt) # 2019-10-02 00:00:00
dt = datetime.datetime.combine(date, datetime.time.min)
print(dt) # 2019-10-02 00:00:00

timedelta类

timedelta表示具体实例中的一段时间,常被用来从datetime对象中添加或移除一段特定的时间

class timedelta(SupportsAbs[timedelta]):
   def __init__(self, days, seconds, microseconds, milliseconds, minutes, hours, weeks,):
       pass
   def days(self):
       pass
   def total_seconds(self):
        pass

使用datetime.timedelta()类:

import datetime
td = datetime.timedelta(days=30)
print(td) # 30 days, 0:00:00
print(type(td)) # <class 'datetime.timedelta'>
print(datetime.date.today()) # 2020-07-01
print(datetime.date.today() + td) # 2020-07-31
dt1 = datetime.datetime(2020, 1, 31, 10, 10, 0)
dt2 = datetime.datetime(2019, 1, 31, 10, 10, 0)
td = dt1 - dt2
print(td) # 365 days, 0:00:00
print(type(td)) # <class 'datetime.timedelta'>
td1 = datetime.timedelta(days=30) # 30 days
td2 = datetime.timedelta(weeks=1) # 1 week
td = td1 - td2
print(td) # 23 days, 0:00:00
print(type(td)) # <class 'datetime.timedelta'>

将两个datetime对象相减可以得到改时间间隔的timedelta对象;
将两个时间间隔相减也可以得到timedelta对象

练习题

模块

1.怎么查出通过 from xx import xx导⼊的可以直接调⽤的⽅法?
当包内的__init__.py模块下有__all__列表时,则为__all__列表内定义的所有子模块。没有__all__列表时,需要看__init__.py内的代码做具体判断
2.了解Collection模块

from collections import Counter
def most_element(language):
    """ Return a list of lines after inserting a word in a specific line. """
    obj = Counter(language)
    ret = obj.most_common(1)
    return (ret[0][0])
    # your code here

language = ['PHP', 'PHP', 'Python', 'PHP', 'Python', 'JS', 'Python', 'Python','PHP', 'Python']
final = most_element(language)
print(final)

datetime模块

import re
from datetime import datetime, timezone, timedelta

def to_timestamp(dt_str, tz_str):
    # 首先,获取用户输入的时间的datetime
    input_dt = datetime.strptime(dt_str, '%Y-%m-%d %H:%M:%S')

    # 上面得到的datetime是没有时区的,因此设置用户输入的对应时区
    # 那么此时需要利用正则获取用户输入的时区
    time_zone_num = re.match(r'UTC([+|-][\d]{1,2}):00', tz_str).group(1)
    time_zone = timezone(timedelta(hours=int(time_zone_num)))  # 创建时区UTC-??

    # 将上面得到的datetime强制设置为UTC-??
    input_dt_tz = input_dt.replace(tzinfo=time_zone)
    
    return input_dt_tz.timestamp()

t1 = to_timestamp('2015-6-1 08:10:30', 'UTC+7:00')
assert t1 == 1433121030.0, t1
t2 = to_timestamp('2015-5-31 16:10:30', 'UTC-09:00')
assert t2 == 1433121030.0, t2
from datetime import date, timedelta

def all_sundays(year):
   d = date(year, 1, 5)                    # January 5th
   d += timedelta(days = 6 - d.weekday())  # First Sunday
   while d.year == year:
      yield d
      d += timedelta(days = 7)

for d in all_sundays(2020):
   print(d)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值