当前位置: 代码迷 >> 综合 >> Python cookbook time and data
  详细解决方案

Python cookbook time and data

热度:16   发布时间:2023-11-05 19:31:47.0

1对浮点数执行指定精度的舍入计算

解决办法:对于简单的舍入计算,使用内置的round(value,ndigits)函数,当一个值刚好在两个边界的中间的时候,round函数返回离他最近的偶数,也就是说1.5和2.5都返回2...传给round函数的ndigits参数可以是负数.(-1,-2,-3)最后一位,倒数第二位...

2执行精确地浮点数计算(有一定的性能损耗)

decimal. 更精确的适用于金融数学,要是对精度没有那么高的要求还是使用原生的,因为原生的函数比较快

from decimal import localcontext,Decimal
a=Decimal('1.3')
b=Decimal('1.7')
print(a/b)
out[]:0.7647058823529411764705882353
from decimal import localcontext,Decimal
a=Decimal('1.3')
b=Decimal('1.7')
with localcontext() as ctx:ctx.prec=3print(a/b)
out[]:0.765
nums=[1.23e+18,1,-1.23e+18]
sum(nums)
out[]:0
import math
math.fsum(nums)
out[]:1.0 #使用更精确

3数字的格式化输出

x=1234.56789
format(x,'0.2f')
format(x,'>10.2f')
format(x,'<10.2f')
format(x,'^10.2f')
format(x,'e')
format(x,'0.2E')

4 2816进制整数

bin(),oct(),hex() 不想有ob这样的前缀可以使用format,format(value,'b/o/x'),负数的时候显示直接是带着负号的,要是想显示无符号数可以这样format(2**32+value,'b/o/x'),为了不同的进制转换成整数字符串,简单的使用带有禁止的int()函数即可 int('4d2',16)

5字节到大整数的打包与解包

为了将bytes解析为整数,使用int.from_bytes()方法,并可以指定字节顺序,int.form_bytes(data,'little/big') int型x ,  x.to_bytes(16,'big')

字节顺顺序规则(little或big)仅仅指定了构建整数时的字节的低位高位排列方式.    int.bit_length()方法来决定需要多少个字节来存储这个值

7无穷大与NaN

创建或测试正无穷,负无穷或NaN的浮点数

float('inf') float('-inf') float('nan')

为了测试这些值的存在 math.isinf() math.isnan()

8分数计算

fractions模块可以被用来执行包括分数的数学运算.

from fractions import Fraction

a=Fraction(5,4)

9大型数组计算:

numpy库...比标准的Python列表更适合用来做数学运算..numpy中的标量运算会作用在每一个元素上,

10矩阵与线性代数运算

矩阵与线性代数运算,矩阵乘法,寻找行列式,求解线性方程组等

import numpy as np
m=np.matrix([[1,-2,3],[0,4,5],[7,8,-9]])
m.T#矩阵的转置
numpy.linalg子包中可以找到更多的操作函数

11随机选择

random模块有大量的函数用来产生随机数和随机选择元素..random.choice()

import numpy as np
m=np.matrix([[1,-2,3],[0,4,5],[7,8,-9]])
random.sample(values,2)
random.shuffle(values)#打乱顺序
random.randint(0,10)#生成随机整数
random.random()#生成0到1范围内均匀分布的浮点数
random.getrandbits(10)#获取N位随机数(二进制)的整数
random.seed()#修改初始化种子 
random.seed(123) random.seed(b'bytedata') #seed based on integer/byte  given
random.uniform(a,b)#计算均匀分布随机数
random.gauss(u,sigma)#计算正态分布随机数

12基本的日期和时间转换

为了执行不同时间单位的转换与计算,使用datetime模块,表示一个时间段,可以创建一个timedelta

from datetime import timedelta
a=timedelta(days=2,hours=6)
b=timedelta(hours=4.5)
c=a+b
print(c.days,c.seconds)from datetime import datetime
a=datetime(2012,9,23)
print(a+timedelta(days=10))datetime.today()
datetime.now()

datetime会自动处理闰年.. 更加复杂的日期操作,比如处理时区,模糊时间范围,节假日计算等等,可以使用dateutil

dateutil.relativedelta()函数进行时间计算 a+relativedelta(month=+1)

13计算最后一个周五的日期

datetime模块中有工具和类来执行这样的计算

weekdays=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
def get_prev(datename,start_date=None):if start_date is None:start_date=datetime.today()now_week=start_date.weekday()target_week=weekdays.index(datename)days_ago=(7+now_week-target_week)%7if days_ago==0:days_ago=7target_day=start_date-timedelta(days=days_ago)return target_day
get_prev('Monday')

14计算当前月份的日期范围:循环该月日期的每一天

from datetime import datetime,timedelta
import calendar
def get_month(start_date=None):if start_date is None:start_date=datetime.today().replace(day=1)_,monthday=calendar.monthrange(start_date.year,start_date.month) #返回该月的天数,月数...for i in range(monthday):print(timedelta(i)+start_date)end_date=start_date+timedelta(monthday)return start_date,end_date
get_month()#生成器写法def day_range(start,stop,step):while start<stop:yield startstart=start+step
for d in day_range(datetime(2018,10,23),datetime(2018,11,25),timedelta(days=6)):print (d)

15字符串转化为日期:

text='2102-09-20'
y=datetime.strptime(text,'%Y-%m-%d')
#数据量多的话使用split因为比strptime函数要快很多(7倍)
from datetime import datetime
def splistr(str):year,month,day=str.split('-')return datetime(int(year),int(month),int(day))
splistr('2018-09-09')

P127 chapter four

  相关解决方案