數字、日期和時間

 

1、對數值進行取整git

  將浮點數取整到固定的小數位:roung(value, ndigits),ndigits能夠是負數,取整到十位、百位、千位等。算法

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

  >>> round(16743, -3)      # 17000函數

  >>> format(1.2345, '0.3f')  # 1.235性能

 

2、精確的小數計算spa

  浮點數沒法精確表達出全部的十進制小數位。設計

  0.3的二進制表示是無限循環,因此若是要精確表示0.3,計算機須要無限個二進制位才能作到。code

  然而計算機的內存、CPU寄存器等等硬件單元都是有限的,只能表示有限的二進制位。orm

  >>> from decimal import Decimal對象

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

 

3、數值作格式化輸出

  使用內建的format()函數便可。

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

  

4、二進制、八進制和十六進制數

  將一個整數轉換爲二進制、八進制和十六進制的文本字符串形式,分別使用內建的bin()、oct()、hex()函數便可。

  >>> x = 1234

  >>> bin(x)   # '0b10011010010'

  >>> oct(x)   # '0o2322'

  >>> hex(x)  # '0x4d2'

  不但願出現0b、0o、0x這樣的前綴,能夠使用format()函數

  >>> format(x, 'b'), format(x, 'o'), format(x, 'x')

  轉換回10進制:

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

  確保八進制數前添加0o前綴:

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

 

5、字節串中打包和解包大整數

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

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

 

6、複數運算

  複數經過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)

 

7、處理無窮大和 NaN(Not a number)

  檢測是否出現該值用math.isinf()和math.isnan()函數

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

  (1)無窮大值在數學計算中會進行傳播

  (2)某些特定的操做會致使未定義的行爲併產生NaN的結果

  (3)NaN會經過全部的操做進行傳播

 

8、分數的計算

  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)

 

11、隨機選擇

  (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() 函數修改初始的種子值。

 

12、時間換算

  利用 datetime 模塊來完成不一樣時間單位間的換算。

  >>> from datetime import timedelta

  >>> 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

 

十3、計算上週 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

 

十4、找出當月的日期範圍

  循環迭代當月中的每一個日期。

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)

 

十5、將字符串轉換爲日期

  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))

 

十6、涉及時區的日期處理

  時區名稱: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)

相關文章
相關標籤/搜索