Datetime diff python

Bắt đầu từ NumPy 1. 7, có các kiểu dữ liệu mảng lõi vốn hỗ trợ chức năng ngày giờ. Kiểu dữ liệu được gọi là

>>> np.datetime64('2005-02-25T03:30')
numpy.datetime64('2005-02-25T03:30')
3, được đặt tên như vậy vì
>>> np.datetime64('2005-02-25T03:30')
numpy.datetime64('2005-02-25T03:30')
4 đã được sử dụng bởi thư viện chuẩn Python

Datetime64 Quy ước và Giả định#

Tương tự như lớp

>>> np.datetime64('2005-02-25T03:30')
numpy.datetime64('2005-02-25T03:30')
5 của Python, ngày tháng được thể hiện trong Lịch Gregorian hiện tại, kéo dài vô thời hạn cả trong tương lai và trong quá khứ. [ 1 ] Trái ngược với Python
>>> np.datetime64('2005-02-25T03:30')
numpy.datetime64('2005-02-25T03:30')
5, vốn chỉ hỗ trợ các năm trong . e. năm 2 TCN được đánh số −1, năm 1 TCN được đánh số 0, năm 1 AD được đánh số 1.

Thời gian tức thì, chẳng hạn 16. 23. 32. 234, được biểu thị đếm giờ, phút, giây và phân số từ nửa đêm. tôi. e. 00. 00. 00. 000 là nửa đêm, 12. 00. 00. 000 là buổi trưa, v.v. Mỗi ngày dương lịch có đúng 86400 giây. Đây là thời gian “ngây thơ”, không có khái niệm rõ ràng về múi giờ hoặc thang thời gian cụ thể (UT1, UTC, TAI, v.v. ). [ 2 ]

[ 1 ]

Lịch thu được bằng cách mở rộng lịch Gregorian trước khi chính thức được thông qua vào tháng 10. Ngày 15 tháng 1 năm 1582 được gọi là Lịch Gregorian Proleptic

[ 2 ]

Giả định 86400 giây mỗi ngày theo lịch không hợp lệ đối với UTC, thang thời gian dân sự ngày nay. Trên thực tế, do sự hiện diện của giây nhuận trong những dịp hiếm hoi, một ngày có thể dài 86401 hoặc 86399 giây. Ngược lại, giả định ngày 86400 đúng với thang thời gian TAI. Hỗ trợ rõ ràng cho chuyển đổi TAI và TAI sang UTC, tính theo giây nhuận, đã được đề xuất nhưng chưa được triển khai. Xem thêm phần thiếu sót bên dưới

Ngày giờ cơ bản#

Cách cơ bản nhất để tạo ngày giờ là từ các chuỗi ở định dạng ngày hoặc giờ theo tiêu chuẩn ISO 8601. Cũng có thể tạo thời gian dữ liệu từ một số nguyên bằng cách bù tương ứng với Unix epoch (00. 00. 00 UTC ngày 1 tháng 1 năm 1970). Đơn vị cho bộ nhớ trong được chọn tự động từ dạng chuỗi và có thể là đơn vị ngày hoặc time unit. The date units are years (‘Y’), months (‘M’), weeks (‘W’), and days (‘D’), while the time units are hours (‘h’), minutes (‘m’), seconds (‘s’), milliseconds (‘ms’), and some additional SI-prefix seconds-based units. The

>>> np.datetime64('2005-02-25T03:30')
numpy.datetime64('2005-02-25T03:30')
3 data type also accepts the string “NAT”, in any combination of lowercase/uppercase letters, for a “Not A Time” value.

Thí dụ

Ngày ISO đơn giản

>>> np.datetime64('2005-02-25')
numpy.datetime64('2005-02-25')

Từ một số nguyên và một đơn vị ngày, 1 năm kể từ kỷ nguyên UNIX

>>> np.datetime64(1, 'Y')
numpy.datetime64('1971')

Sử dụng tháng cho đơn vị

________số 8

Chỉ xác định tháng, nhưng buộc đơn vị 'ngày'

>>> np.datetime64('2005-02', 'D')
numpy.datetime64('2005-02-01')

Từ một ngày và thời gian

>>> np.datetime64('2005-02-25T03:30')
numpy.datetime64('2005-02-25T03:30')

NAT (không phải là thời gian)

>>> np.datetime64('2005-02-25T03:30')
numpy.datetime64('2005-02-25T03:30')
1

Khi tạo một mảng ngày giờ từ một chuỗi, vẫn có thể tự động chọn đơn vị từ các đầu vào, bằng cách sử dụng loại ngày giờ với các đơn vị chung

Thí dụ

>>> np.datetime64('2005-02-25T03:30')
numpy.datetime64('2005-02-25T03:30')
2

>>> np.datetime64('2005-02-25T03:30')
numpy.datetime64('2005-02-25T03:30')
3

Một mảng thời gian có thể được tạo từ các số nguyên biểu thị dấu thời gian POSIX với đơn vị đã cho

Thí dụ

>>> np.datetime64('2005-02-25T03:30')
numpy.datetime64('2005-02-25T03:30')
4

>>> np.datetime64('2005-02-25T03:30')
numpy.datetime64('2005-02-25T03:30')
5

Loại datetime hoạt động với nhiều hàm NumPy phổ biến, ví dụ:

>>> np.datetime64('2005-02-25T03:30')
numpy.datetime64('2005-02-25T03:30')
9 có thể được sử dụng để tạo phạm vi ngày

Thí dụ

Tất cả các ngày trong một tháng

>>> np.datetime64(1, 'Y')
numpy.datetime64('1971')
0

Đối tượng datetime đại diện cho một thời điểm duy nhất. Nếu hai mốc thời gian có các đơn vị khác nhau, chúng vẫn có thể biểu thị cùng một thời điểm và việc chuyển đổi từ đơn vị lớn hơn như tháng sang đơn vị nhỏ hơn như ngày được coi là cách 'an toàn' vì thời điểm vẫn được biểu thị chính xác

Thí dụ

>>> np.datetime64(1, 'Y')
numpy.datetime64('1971')
1

>>> np.datetime64(1, 'Y')
numpy.datetime64('1971')
2

Không dùng nữa kể từ phiên bản 1. 11. 0. NumPy không lưu trữ thông tin múi giờ. Để tương thích ngược, datetime64 vẫn phân tích cú pháp chênh lệch múi giờ mà nó xử lý bằng cách chuyển đổi thành UTC±00. 00 (giờ Zulu). Hành vi này không được dùng nữa và sẽ phát sinh lỗi trong tương lai.

Datetime và Timedelta Arithmetic#

NumPy cho phép phép trừ hai giá trị ngày giờ, một thao tác tạo ra một số có đơn vị thời gian. Bởi vì NumPy không có hệ thống đại lượng vật lý trong cốt lõi của nó, nên kiểu dữ liệu

>>> np.datetime64('2005-02-25T03:30')
numpy.datetime64('2005-02-25T03:30')
10 đã được tạo để bổ sung cho
>>> np.datetime64('2005-02-25T03:30')
numpy.datetime64('2005-02-25T03:30')
3. Các đối số cho
>>> np.datetime64('2005-02-25T03:30')
numpy.datetime64('2005-02-25T03:30')
10 là một số, để biểu thị số lượng đơn vị và đơn vị ngày/giờ, chẳng hạn như (D)ay, (M)onth, (Y)ear, (h)ours, (m)inutes hoặc . Kiểu dữ liệu
>>> np.datetime64('2005-02-25T03:30')
numpy.datetime64('2005-02-25T03:30')
10 cũng chấp nhận chuỗi “NAT” thay cho số đối với giá trị “Không phải lúc”

Thí dụ

>>> np.datetime64(1, 'Y')
numpy.datetime64('1971')
3

>>> np.datetime64(1, 'Y')
numpy.datetime64('1971')
4

>>> np.datetime64(1, 'Y')
numpy.datetime64('1971')
5

Datetimes và Timedeltas phối hợp với nhau để cung cấp các cách tính toán datetime đơn giản

Thí dụ

>>> np.datetime64(1, 'Y')
numpy.datetime64('1971')
6

>>> np.datetime64(1, 'Y')
numpy.datetime64('1971')
7

>>> np.datetime64(1, 'Y')
numpy.datetime64('1971')
8

>>> np.datetime64(1, 'Y')
numpy.datetime64('1971')
9

>>> np.datetime64('2005-02')
numpy.datetime64('2005-02')
0

>>> np.datetime64('2005-02')
numpy.datetime64('2005-02')
1

>>> np.datetime64('2005-02')
numpy.datetime64('2005-02')
2

Có hai đơn vị Timedelta ('Y', năm và 'M', tháng) được xử lý đặc biệt vì chúng thay đổi bao nhiêu thời gian tùy thuộc vào thời điểm chúng được sử dụng. Trong khi một đơn vị ngày timedelta tương đương với 24 giờ, không có cách nào để chuyển đổi đơn vị tháng thành ngày, vì các tháng khác nhau có số ngày khác nhau

Thí dụ

>>> np.datetime64('2005-02')
numpy.datetime64('2005-02')
3

>>> np.datetime64('2005-02')
numpy.datetime64('2005-02')
4

>>> np.datetime64('2005-02')
numpy.datetime64('2005-02')
5

Ngày giờ Đơn vị #

Các kiểu dữ liệu Datetime và Timedelta hỗ trợ một số lượng lớn đơn vị thời gian, cũng như các đơn vị chung có thể được ép buộc vào bất kỳ đơn vị nào khác dựa trên dữ liệu đầu vào

Ngày giờ luôn được lưu trữ với kỷ nguyên 1970-01-01T00. 00. Điều này có nghĩa là các ngày được hỗ trợ luôn là một khoảng đối xứng xung quanh kỷ nguyên, được gọi là "khoảng thời gian" trong bảng bên dưới

Độ dài của khoảng là phạm vi của số nguyên 64 bit nhân với độ dài của ngày hoặc đơn vị. Ví dụ: khoảng thời gian cho 'W' (tuần) dài hơn chính xác 7 lần so với khoảng thời gian cho 'D' (ngày) và khoảng thời gian cho 'D' (ngày) dài hơn chính xác 24 lần so với khoảng thời gian

Đây là đơn vị ngày

Mã số

Nghĩa

Khoảng thời gian (tương đối)

Khoảng thời gian (tuyệt đối)

Y

năm

+/- 9. 2e18 tuổi

[9. 2e18 TCN, 9. 2e18 sau Công Nguyên]

M

tháng

+/- 7. 6e17 tuổi

[7. 6e17 TCN, 7. 6e17 SCN]

W

tuần

+/- 1. 7e17 tuổi

[1. 7e17 TCN, 1. 7e17 SCN]

D

ngày

+/- 2. 5e16 tuổi

[2. 5e16 TCN, 2. 5e16 SCN]

Và đây là đơn vị thời gian

Mã số

Nghĩa

Khoảng thời gian (tương đối)

Khoảng thời gian (tuyệt đối)

h

giờ

+/- 1. 0e15 tuổi

[1. 0e15 TCN, 1. 0e15 SCN]

m

phút

+/- 1. 7e13 tuổi

[1. 7e13 TCN, 1. 7e13 SCN]

s

thứ hai

+/- 2. 9e11 tuổi

[2. 9e11 TCN, 2. 9e11 SCN]

bệnh đa xơ cứng

một phần nghìn giây

+/- 2. 9e8 tuổi

[ 2. 9e8 TCN, 2. 9e8 sau Công nguyên]

chúng tôi / μs

phần triệu giây

+/- 2. 9e5 năm

[290301 TCN, 294241 SCN]

ns

nano giây

+/- 292 năm

[ 1678 SCN, 2262 SCN]

ps

pico giây

+/- 106 ngày

[ 1969 SCN, 1970 SCN]

fs

femto giây

+/- 2. 6 tiếng

[ 1969 SCN, 1970 SCN]

như

atto giây

+/- 9. 2 giây

[ 1969 SCN, 1970 SCN]

Chức năng ngày làm việc#

Để cho phép sử dụng ngày giờ trong ngữ cảnh chỉ một số ngày nhất định trong tuần là hợp lệ, NumPy bao gồm một tập hợp các hàm “busday” (ngày làm việc)

Mặc định cho các chức năng ngày bận rộn là các ngày hợp lệ duy nhất là từ Thứ Hai đến Thứ Sáu (ngày làm việc thông thường). Việc triển khai dựa trên một “mặt nạ tuần” chứa 7 cờ Boolean để biểu thị các ngày hợp lệ;

Các chức năng “busday” có thể kiểm tra thêm danh sách các ngày “nghỉ lễ”, các ngày cụ thể không phải là ngày hợp lệ

Hàm

>>> np.datetime64('2005-02-25T03:30')
numpy.datetime64('2005-02-25T03:30')
14 cho phép bạn áp dụng độ lệch được chỉ định trong ngày làm việc cho thời gian biểu với đơn vị là 'D' (ngày)

Thí dụ

>>> np.datetime64('2005-02')
numpy.datetime64('2005-02')
6

>>> np.datetime64('2005-02')
numpy.datetime64('2005-02')
7

Khi ngày đầu vào rơi vào cuối tuần hoặc ngày lễ, trước tiên,

>>> np.datetime64('2005-02-25T03:30')
numpy.datetime64('2005-02-25T03:30')
14 sẽ áp dụng quy tắc để chuyển ngày thành ngày làm việc hợp lệ, sau đó áp dụng giá trị bù trừ. Quy tắc mặc định là 'nâng cao', quy tắc này chỉ đơn giản là tăng một ngoại lệ. Các quy tắc thường được sử dụng nhất là 'chuyển tiếp' và 'lùi'

Thí dụ

>>> np.datetime64('2005-02')
numpy.datetime64('2005-02')
8

>>> np.datetime64('2005-02')
numpy.datetime64('2005-02')
9

>>> np.datetime64('2005-02', 'D')
numpy.datetime64('2005-02-01')
0

>>> np.datetime64('2005-02', 'D')
numpy.datetime64('2005-02-01')
1

>>> np.datetime64('2005-02', 'D')
numpy.datetime64('2005-02-01')
2

Trong một số trường hợp, việc sử dụng hợp lý cuộn và phần bù là cần thiết để có được câu trả lời mong muốn

Thí dụ

Ngày làm việc đầu tiên vào hoặc sau một ngày

>>> np.datetime64('2005-02', 'D')
numpy.datetime64('2005-02-01')
3

Ngày làm việc đầu tiên hoàn toàn sau một ngày

>>> np.datetime64('2005-02', 'D')
numpy.datetime64('2005-02-01')
4

Hàm này cũng hữu ích để tính toán một số loại ngày như ngày lễ. Ở Canada và U. S. , Ngày của mẹ là vào Chủ nhật thứ hai của tháng Năm, có thể được tính bằng mặt nạ tuần tùy chỉnh

Thí dụ

>>> np.datetime64('2005-02', 'D')
numpy.datetime64('2005-02-01')
5

Khi hiệu suất là quan trọng để thao tác nhiều ngày làm việc với một lựa chọn cụ thể về mặt nạ trong tuần và ngày lễ, thì có một đối tượng

>>> np.datetime64('2005-02-25T03:30')
numpy.datetime64('2005-02-25T03:30')
16 lưu trữ dữ liệu cần thiết ở dạng được tối ưu hóa

np. is_busday(). #

Để kiểm tra giá trị

>>> np.datetime64('2005-02-25T03:30')
numpy.datetime64('2005-02-25T03:30')
3 xem đó có phải là ngày hợp lệ hay không, hãy sử dụng
>>> np.datetime64('2005-02-25T03:30')
numpy.datetime64('2005-02-25T03:30')
18

Thí dụ

>>> np.datetime64('2005-02', 'D')
numpy.datetime64('2005-02-01')
6

np. busday_count(). #

Để tìm xem có bao nhiêu ngày hợp lệ trong một phạm vi datetime64 đã chỉ định, hãy sử dụng

>>> np.datetime64('2005-02-25T03:30')
numpy.datetime64('2005-02-25T03:30')
19

Thí dụ

>>> np.datetime64('2005-02', 'D')
numpy.datetime64('2005-02-01')
7

Nếu bạn có một mảng các giá trị datetime64 ngày và bạn muốn đếm xem có bao nhiêu trong số đó là ngày hợp lệ, bạn có thể thực hiện việc này

Thí dụ

>>> np.datetime64('2005-02', 'D')
numpy.datetime64('2005-02-01')
8

Tuần lễ tùy chỉnh #

Dưới đây là một số ví dụ về giá trị mặt nạ tuần tùy chỉnh. Những ví dụ này chỉ định mặc định “busday” của Thứ Hai đến Thứ Sáu là những ngày hợp lệ

Vài ví dụ

>>> np.datetime64('2005-02', 'D')
numpy.datetime64('2005-02-01')
9

Datetime64 thiếu sót #

Giả định rằng tất cả các ngày dài chính xác là 86400 giây khiến cho

>>> np.datetime64('2005-02-25T03:30')
numpy.datetime64('2005-02-25T03:30')
3 phần lớn tương thích với ngữ nghĩa của Python
>>> np.datetime64('2005-02-25T03:30')
numpy.datetime64('2005-02-25T03:30')
4 và “thời gian POSIX”; . Một bản tóm tắt ngắn gọn không đầy đủ được đưa ra dưới đây

  • Không thể phân tích các dấu thời gian UTC hợp lệ xảy ra trong một giây nhuận dương

    Thí dụ

    “2016-12-31 23. 59. 60 UTC” là một giây nhuận, do đó “2016-12-31 23. 59. 60. 450 UTC” là dấu thời gian hợp lệ không thể phân tích cú pháp bởi

    >>> np.datetime64('2005-02-25T03:30')
    numpy.datetime64('2005-02-25T03:30')
    
    3

    >>> np.datetime64('2005-02-25T03:30')
    numpy.datetime64('2005-02-25T03:30')
    
    0

  • Tính toán Timedelta64 giữa hai ngày UTC có thể bị sai bởi một số nguyên SI giây

    Thí dụ

    Tính số giây SI giữa “2021-01-01 12. 56. 23. 423 UTC” và “2001-01-01 00. 00. 00. 000 UTC”

    >>> np.datetime64('2005-02-25T03:30')
    numpy.datetime64('2005-02-25T03:30')
    
    1

    tuy nhiên câu trả lời đúng là 631198588. 423 SI giây vì có 5 giây nhuận trong khoảng thời gian từ 2001 đến 2021

  • Tính toán Timedelta64 cho các ngày trong quá khứ không trả về SI giây, như người ta mong đợi

    Thí dụ

    Tính số giây giữa “000-01-01 UT” và “1600-01-01 UT”, trong đó UT là giờ quốc tế

    >>> np.datetime64('2005-02-25T03:30')
    numpy.datetime64('2005-02-25T03:30')
    
    2

    Kết quả tính toán, 50491123200 giây, thu được bằng số ngày đã trôi qua (584388) nhân 86400 giây; . Giá trị chính xác tính bằng SI giây chỉ có thể được ước tính, e. g sử dụng dữ liệu được xuất bản trong Đo vòng quay của Trái đất. 720 trước Công nguyên đến sau Công nguyên 2015, 2016, Kỷ yếu của Hiệp hội Hoàng gia A 472, bởi Stephenson et. tất cả. Ước tính hợp lý là 50491112870 ± 90 giây, với chênh lệch là 10330 giây