加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

【Python进阶】数字、日期和时间

发布时间:2020-12-20 10:45:17 所属栏目:Python 来源:网络整理
导读:? 一、对数值进行取整 将浮点数取整到固定的小数位:roung(value,ndigits),ndigits可以是负数,取整到十位、百位、千位等。 round(1.456,2) ? ? # 1.46 round(16743,-3) ? ? ?# 17000 format(1.2345,‘0.3f‘)? # 1.235 ? 二、精确的小数计算 浮点数无法精

?

一、对数值进行取整

  将浮点数取整到固定的小数位:roung(value,ndigits),ndigits可以是负数,取整到十位、百位、千位等。

  >>> round(1.456,2) ? ?  # 1.46

  >>> round(16743,-3) ? ? ?# 17000

  >>> format(1.2345,‘0.3f‘)? # 1.235

?

二、精确的小数计算

  浮点数无法精确表达出所有的十进制小数位。

  0.4的二进制表示是无限循环,所以如果要精确表示0.4,计算机需要无限个二进制位才能做到。

  然而计算机的内存、CPU寄存器等等硬件单元都是有限的,只能表示有限的二进制位。

  >>> from decimal import?Decimal

  >>> Decimal(‘4.2‘) + Decimal(‘2.1‘)  # Decimal(‘6.3‘)

?

三、数值做格式化输出

  使用内建的format()函数即可。

  >>> ‘The value is {:0,.2f}‘.format(123456.789)  # 123,456.79

  

四、二进制、八进制和十六进制数

  将一个整数转换为二进制、八进制和十六进制的文本字符串形式,分别使用内建的bin()、oct()、hex()函数即可。

  >>> x = 1234

  >>> bin(x)   #?‘0b10011010010‘

  >>> oct(x)   #?‘0o2322‘

  >>> hex(x)  #?‘0x4d2‘

  不希望出现0b、0o、0x这样的前缀,可以使用format()函数

  >>> format(x,‘b‘),?format(x,‘o‘),‘x‘)

  转换回10进制:

  >>> int(‘4d2‘,16)  # 1234

  确保八进制数前添加0o前缀:

  >>> os.chmod(‘script.py‘. 0o755)

?

五、字节串中打包和解包大整数

  >>> int.from_bytes(data,‘little‘)

  >>> x.to_bytes(16,‘big‘)

?

六、复数运算

  复数通过complex(real,imag)函数来指定,或者通过浮点数再加上后缀j来指定。

  >>> a = complex(2,4)  # (2+4j)

  >>> b = 3 - 5j

  >>> a.real,a.imag,a.conjugate()  #?实部、虚部以及共轭值

  求正弦、余弦或平方根使用cmath模块

  >>> cmath.sin(a),cmath.cos(a),smath.exp(a)

?

七、处理无穷大和 NaN(Not?a?number)

  检测是否出现该值用math.isinf()和math.isnan()函数

  >>> float(‘inf‘),float(‘-inf‘),float(‘nan‘)

  (1)无穷大值在数学计算中会进行传播

  (2)某些特定的操作会导致未定义的行为并产生NaN的结果

  (3)NaN会通过所有的操作进行传播

?

八、分数的计算

  fractions模块处理设计焚书的数学计算问题

  >>> form fractions import Fraction

  >>> a = Fraction(5,4)  # 5/4

  >>> a.numerator,a.denominator  # 5,4

  >>> float(a)

  >>> x = 3.75

  >>> y = Fraction(*x.as_integer_ratio())  # Fraction(15,4)

?

十一、随机选择

  (1)从序列中挑选元素:

  >>> random.choice([1,2,3,4,5])

  (2)序列中随机取N个元素:

  >>> random.sample(values,N)

  (3)打乱序列顺序:

  >>> random.shuffle(values)

  (4)产生随机整数

  >>> random.randint(0,10)  # 0~10范围

  (5)产生0~1均匀分布的浮点数值:

  >>> random.random()

  (6)由N个随机比特位所表示的整数:

  >>> random.getrandbits(N)

  (7)random模块采用马特赛特旋转算法,这是一个确定性算法,但是可以通过?random.seed()?函数修改初始的种子值。

?

十二、时间换算

  利用 datetime 模块来完成不同时间单位间的换算。

  >>> from datetime import datedelta

  >>> a = timedelta(days=2,hours=6,minutes=6)

  >>> from datetime import datetime

  >>> b = datetime(2019,9,11)

  >>> c = b - a

  >>> datetime.today()

  处理时区、模糊时间范围、计算节日的日期使用 dateutil 模块,同时解决datetime不能计算月份的问题。

  >>> from dateutil.relativedelta import relativedelta

  >>> a +?relativedelta(months=+1)

  >>> d = relativedelta(b,a)  #?计算相差的天数

  >>> d.months,d.days

?

十三、计算上周 X的日期

  使用datetime模块完成计算例子:

def get_previous_byday(dayname,start_date=None):
    
    weekdays = [Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday]

    if start_date is None:
        start_date = datetime.today()

    day_num = start_date.weekday()
    day_num_target = weekdays.index(dayname)
    day_ago = (7 + day_num - day_num_target) % 7
    if day_ago == 0:
        day_ago = 7
    target_day = start_date - timedelta(days=day_ago)
    
    return target_day

  使用dateutil模块计算

  >>> from datetime import datetime

  >>>?from dateutil.relativedelta import relativedelta

  >>> from dateutil.rrule import *

  >>> d = datetime.today()

  >>> d+relativedelta(weekday=FR)    # Next Friday

  >>> d+relativedelta(weekday=FR(-1))   # Last Friday

?

十四、找出当月的日期范围

  循环迭代当月中的每个日期。

from datetime import datetime,timedelta
import calendar

def get_month_range(start_day=None):
    if start_day is None:
        start_day = datetime.today().replace(day=1)
    _,days_in_month = calendar.monthrange(start_day.year,start_day.month)
    end_date = start_day + timedelta(days=days_in_month)
    return (start_day,end_date)

a_day = timedelta(days=1)
first_date,last_date = get_month_range()
while first_date < last_date:
    print(first_date)
    first_date += a_day

  (1)计算出月份中第一天的日期:datetime对象的replace(day=1)方法进行替换。

  (2)calendat.monthrange() 函数,找出待求解的月份中有多少天,返回第一个工作日的星期(返回值0~6)和当月的天数(28~31)

  生成器实现例子:

from datetime import  datetime,timedelta

def get_range(start_day,end_day,step):
    while start_day < end_day:
        yield start_day
        start_day += step

for k in get_range(datetime.today(),datetime(2019,10,1),timedelta(days=1)):
    print(k)

?

十五、将字符串转换为日期

  datetime.strptime()方法支持许多格式化代码,如%Y代表4为数字表示的年份,%m代表2位数字月份,%d代表日期。

  >>> from datetime import datetime

  >>> text = ‘2019-9-11‘

  >>> datetime.strptime(text,‘%Y-%m-%d’)

  但是datetime.strptime()性能表现糟糕体现在处理各种各样的系统区域设置。如果事先知道日期格式,可以自己编写代码:

def parse_ymd(str_date):
    year_s,mon_s,day_s = str_date.split(-)
    return datetime(int(year_s),int(mon_s),int(day_s))

?

十六、涉及时区的日期处理

  时区名称:pyzt.country_timezones,这是一个字典,使用ISO3166国家代码作为key来查询所属时区。

  >>> pyzt.country_timezones[‘CN‘]  # [‘Asia/Shanghai‘,‘Asia/Urumqi‘]

  时区计算:先将本地时间-》UTC时间,UTC时间进行运算-》本地时间

  >>> from pytz import timezone

  >>>?central = timezone(‘Asia/Shanghai‘)

  >>>?loc_d = central.localize(datetime.today())

  >>>?utc_d = loc_d.astimezone(pytz.utc)

  >>>?utc_d + timedelta(minutes=30)

  >>>?later_utc = utc_d + timedelta(minutes=30)

  >>>?later_utc.astimezone(central)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读