[英]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.