2010-02-08 53 views
47

Tôi cần trừ ngày làm việc từ ngày hiện tại.Ngày làm việc bằng Python

Tôi hiện có một số mã cần phải luôn chạy trong ngày làm việc gần đây nhất. Vì vậy, đó có thể là ngày hôm nay nếu chúng tôi là thứ hai đến thứ sáu, nhưng nếu đó là thứ bảy hoặc chủ nhật sau đó tôi cần phải thiết lập nó trở lại thứ sáu trước khi cuối tuần. Tôi hiện đang có một số khá clunky mã để làm điều này:

lastBusDay = datetime.datetime.today() 
if datetime.date.weekday(lastBusDay) == 5:  #if it's Saturday 
    lastBusDay = lastBusDay - datetime.timedelta(days = 1) #then make it Friday 
elif datetime.date.weekday(lastBusDay) == 6:  #if it's Sunday 
    lastBusDay = lastBusDay - datetime.timedelta(days = 2); #then make it Friday 

Có cách nào tốt hơn?

Tôi có thể yêu cầu timedelta hoạt động trong các ngày trong tuần thay vì ngày theo lịch không?

+5

gì về ngày lễ? – SLaks

+0

vâng tôi đã chăm sóc những người: cơ sở dữ liệu của tôi luôn luôn lấp đầy các ngày lễ miễn là họ rơi vào một ngày trong tuần. Nhưng tôi đồng ý, ngày lễ nói chung cũng là một vấn đề. Tôi có nghĩa là tôi có thể bắt đầu nhận được ưa thích và sử dụng sckits.timeseries nhưng thực sự tôi muốn một cái gì đó đơn giản hơn. –

+0

Đây là đoạn trích từ dzzone có thể giúp bạn: http://snippets.dzone.com/posts/show/9173 –

Trả lời

76

Sử dụng gấu trúc!

import pandas as pd 
# BDay is business day, not birthday... 
from pandas.tseries.offsets import BDay 

# pd.datetime is an alias for datetime.datetime 
today = pd.datetime.today() 
print today - BDay(4) 

Kể từ hôm nay là Thứ Năm Tháng 9 26, mà sẽ cung cấp cho bạn một sản lượng:

datetime.datetime(2013, 9, 20, 14, 8, 4, 89761) 
+2

Rất đẹp. đó là câu trả lời đúng, hôm nay. Khi tôi hỏi Q, gấu trúc vẫn còn chưa đầy đủ. –

+3

Bản phát hành gấu trúc gần đây nhất (0.14.0) hỗ trợ lịch ngày lễ quá – fantabolous

12

Dường như có một số tùy chọn nếu bạn mở để cài đặt thêm thư viện.

Bài đăng này mô tả cách xác định ngày làm việc với dateutil.

http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-09/3758.html

BusinessHours cho phép bạn tùy chỉnh xác định danh sách các ngày lễ, vv, để xác định khi nào giờ bạn làm việc (và bằng cách mở rộng ngày làm việc) đang có.

http://pypi.python.org/pypi/BusinessHours/

+0

đẹp nhất Alison. Tuy nhiên không phải là rất đơn giản mặc dù không may. Tôi sẽ đi tuyến đường của bạn mặc dù. Cảm ơn đã giúp đỡ. –

+1

Xác định ngày làm việc trên tất cả các nền văn hóa dường như không đủ đơn giản để đưa vào thư viện chuẩn. –

+2

Một điểm hợp lệ, vì thực sự ứng dụng của tôi là dành cho thị trường tài chính, và Ai Cập và Israel mở cửa vào Chủ nhật. –

6

Có lẽ mã này có thể giúp:

lastBusDay = datetime.datetime.today() 
shift = datetime.timedelta(max(1,(lastBusDay.weekday() + 6) % 7 - 3)) 
lastBusDay = lastBusDay - shift 

Ý tưởng là vào thứ Hai yo phải quay trở lại 3 ngày, vào ngày chủ nhật 2, và 1 trong bất kỳ ngày nào khác.

Tuyên bố (lastBusDay.weekday() + 6) % 7 chỉ cần tái căn cứ thứ hai từ 0 đến 6.

Thực sự không biết nếu điều này sẽ tốt hơn về hiệu suất.

0

Tại sao bạn không thử một cái gì đó như:

lastBusDay = datetime.datetime.today() 
if datetime.date.weekday(lastBusDay) not in range(0,5): 
    lastBusDay = 5 
0
def getNthBusinessDay(startDate, businessDaysInBetween): 
    currentDate = startDate 
    daysToAdd = businessDaysInBetween 
    while daysToAdd > 0: 
     currentDate += relativedelta(days=1) 
     day = currentDate.weekday() 
     if day < 5: 
      daysToAdd -= 1 

    return currentDate 
9

DISCLAMER: Tôi là tác giả ...

tôi đã viết một gói thực hiện chính xác điều này, tính toán ngày làm việc. Bạn có thể sử dụng thông số và ngày lễ của tuần tùy chỉnh.

Tôi đã gặp sự cố chính xác này khi làm việc với dữ liệu tài chính và không tìm thấy bất kỳ giải pháp có sẵn nào dễ dàng, vì vậy tôi đã viết một giải pháp.

Hy vọng điều này hữu ích cho người khác.

https://pypi.python.org/pypi/business_calendar/

+1

cảm ơn rất nhiều, thư viện của bạn đã hoạt động hoàn hảo cho tôi. Có lẽ bạn nên thêm vào tài liệu của bạn rằng thư viện của bạn hỗ trợ ngày tiêu cực nếu bạn muốn trừ ngày, và nó là lên trên pip – guinunez

+0

Này, tôi biết điều này có thể không phải là cách tốt nhất để tiếp cận bạn nhưng tôi chỉ muốn báo cáo một vấn đề Tôi đã có với mô-đun business_calendar của bạn. Tôi thiết lập lịch với các ngày lễ liên bang của Hoa Kỳ: ['2015-01-01', '2015-01-19', '2015-02-16', '2015-05-25', '2015-07- 03 ',' 2015-09-07 ', ' 2015-10-12 ',' 2015-11-11 ', ' 2015-11-26 ',' 2015-12-25 '] sau đó đã cố gắng tính toán sự khác biệt giữa datetime (2015, 1, 16, 15, 28, 40) và datetime (2015, 1, 23, 11, 58, 0) nhưng nó liên tục trả về -1. Tước h/m/s từ các kết quả datetimes (chính xác) trong 4. –

+1

Thực tế khi tiếp tục thử nghiệm một số so sánh ngày nhất định chỉ chặn, không có lý do rõ ràng, dường như không bao giờ trả lại kết quả. Trong ví dụ trên của tôi cố gắng so sánh datetime (2015, 1, 16) với datetime (2015, 1, 25) dẫn đến khối như vậy, có hoặc không đặt rõ ràng bất kỳ ngày lễ nào. Khi điều tra, điều này xảy ra khi thông số date2 xảy ra là ngày không phải là ngày làm việc. –

2

này sẽ cung cấp một máy phát điện của ngày làm việc, tất nhiên không có ngày nghỉ, dừng là datetime.datetime đối tượng. Nếu bạn cần ngày lễ chỉ làm cho lập luận thêm với danh sách các ngày lễ và kiểm tra với 'IFology' ;-)

def workingdays(stop, start=datetime.date.today()): 
    while start != stop: 
     if start.weekday() < 5: 
      yield start 
     start += datetime.timedelta(1) 

Sau đó bạn có thể đếm chúng như

workdays = workingdays(datetime.datetime(2015, 8, 8)) 
len(list(workdays)) 
Các vấn đề liên quan