簡體   English   中英

日期時間范圍中前一天/月/年的第一個可用日期

[英]First available date previous day/month/year from a datetime range

我有一個帶有日期( dfDates )的datetime實例:

2017-03-01 00:00
2017-03-02 00:00
2017-03-04 00:00
...

對於最后一天(這里: 2017-03-04 ),我計算前一天/月/年/等。 如下:

def previous_day(dtToday):
    return dtToday - pd.DateOffset(days=1)

這將返回2017-03-03 但是,該工作日在我的日期范圍( dfDates )中不可用。

因此,我正在尋找一種可靠的方法來查找最接近前一天/月/年/等的日期。在這種情況下,對於前一天,它應該返回2017-03-02

請注意,我知道您可以執行類似於索引-1來獲取前一天。 但是,如果使用上個月(一個月中並不總是有30天)甚至上一年(一年中並不總是有252工作日),情況就會變得很復雜。 因此,是否有一種可靠的方法來獲取最接近的可用日期?

更新

我也了解您可以使用timedelta如下:

from datetime import datetime, timedelta

d = datetime.today() - timedelta(days=days_to_subtract)

然而,如何不會涉及到dtToday ,我怎么能與它聯系起來dfDates 在我的情況下, dtToday並不總是datetime.today() 有時是隨機日期。

不是最有效的,但是您可以嘗試:

# From your function
day_minus_one = previous_day(dtToday)

# Return LAST element in INDEX of DF FROM START TO DAY_MINUS_ONE
actual = df.loc[:day_minus_one].index[-1]

本質上,這將返回您df副本的最后一個索引直到存在date_minus_one(包括date_minus_one)為止 這應該為您提供最接近的日期或日期本身。

你可以試試:

# Returns LAST element of INDEX of df from DAY_MINUS_ONE_HUNDRED to DAY_MINUS_ONE
actual_better = df.loc[day_minus_one_hundred:day_minus_one].index[-1]

如果數據集很大,則只需從minus_one中回顧一百天,因此您不必返回龐大的數組即​​可找到一個日期。

如果我理解正確,那么您實際上不想減去1天,而是希望從可用日期列表中獲得前一個可用日期。 如果是這樣,請考慮以下問題:

available_dates = [
  2017-03-01 00:00,
  2017-03-02 00:00,
  2017-03-04 00:00,
  ...
]

def previous_day(dtToday):
    today_index = available_dates.index(dtToday)
    return available_dates[today_index-1]

當然,這假設您的available_dates已排序

編輯:

如果您希望能夠減去月份和年份,則需要稍微復雜一點:

# Sorted
available_dates = [
  2017-03-01 00:00,
  2017-03-02 00:00,
  2017-03-04 00:00,
  ...
]

subtract_from_date(date, day=None, month=None, year=None):
  # check if it's day/month/yeah
  ...
  # do the actual subtraction and store it in substracted_date
  ...
  # get the closest date
  for index, date in enumerate(available_dates):
     if date > substracted_date:
       return available_dates[index-1]

我這樣解決了:

  • dtToday =參考日期
  • dtDates =可用日期的日期時間序列
  • nbOffset =我們要返回的天數/月數/年數

碼:

def previous_day(dtToday, dtDates, nbOffset):
    prevx   = dtToday - pd.DateOffset(days=nbOffset)
    return test_day_in(prevx, dtDates)

def previous_month(dtToday, dtDates, nbOffset):
    prevx = dtToday - pd.DateOffset(months=nbOffset)
    return test_day_in(prevx, dtDates)

def previous_year(dtToday, dtDates, nbOffset):
    prevx = dtToday - pd.DateOffset(years=nbOffset)
    return test_day_in(prevx, dtDates)

def test_day_in(dtTest, dtDates):
    if dtTest in dtDates:
        return dtTest
    else:
        return tryNextDay(dtTest, dtDates)

def tryNextDay(dtTest, dtDates):

    # if not outside the bound
    if (dtTest < dtDates.min()):
        return dtDates.min()

    # check if next day exist
    if (dtTest + pd.DateOffset(days=1) <= dtDates.max()):
        return previous_day(dtTest + pd.DateOffset(days=2), dtDates, 1) # 2-1
    else:
        print('warning, tryNextDay triggered')
        # should not be triggered, it should take by default the dtDates.min() if far outside range
        return dtTest

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM