英文:
How to find the beginning and start of a week (Python)
问题
我正在尝试创建一个程序,该程序将获取今天的日期并查找最近的一周的历史开始和结束日期(不包括银行假日和周末)。想法是,它将获取今天的日期"02/26/23",并返回开始日期02/21/23(02/20/23是银行假日),以及本周的结束日期02/24/23。
我的当前代码如下:
import pandas as pd
import datetime as dt
from pandas.tseries.holiday import USFederalHolidayCalendar
end = dt.datetime.now()
start = dt.datetime(end.year, end.month, end.day-5)
dr = pd.date_range(start=start, end=end)
cal = USFederalHolidayCalendar()
holidays = cal.holidays(start=dr.min(), end=dr.max())
A = dr[~dr.isin(holidays)]
B = A[A.weekday != 5]
B = B[B.weekday != 6]
for year in set(B.year):
tmp = B[B.year == year]
for week in set(tmp.week):
temp = tmp[tmp.week == week]
print(temp[temp.weekday == temp.weekday.min()]) # 本周开始日期
print(temp[temp.weekday == temp.weekday.max()]) # 本周结束日期
这将产生以下结果:
DatetimeIndex(['2023-02-21'], dtype='datetime64[ns]', freq=None)
DatetimeIndex(['2023-02-24'], dtype='datetime64[ns]', freq=None)
但也会出现"FutureWarning: weekofyear and week have been deprecated..."。有没有办法以datetime格式获取这些日期,以便如果打印出来,它会显示例如"2023-02-21"。如何避免这个FutureWarning警告?
(顺便说一下,我从https://stackoverflow.com/a/43674721/21292653获取了部分代码。)
英文:
I am trying to create a program that will take today's date and find the most recent historical beginning and end of the week (excluding bank holidays and weekends). The idea being is that it will take today's date "02/26/23" and return 02/21/23 for the beginning (02/20/23 was a bank holiday) and 02/24/23 for the end of the week.
My current code is
import pandas as pd
import datetime as dt
from pandas.tseries.holiday import USFederalHolidayCalendar
end = dt.datetime.now()
start = dt.datetime(end.year, end.month, end.day-5)
dr = pd.date_range(start=start, end=end)
cal = USFederalHolidayCalendar()
holidays = cal.holidays(start=dr.min(), end=dr.max())
A = dr[~dr.isin(holidays)]
B = A[A.weekday != 5]
B = B[B.weekday != 6]
for year in set(B.year):
tmp = B[B.year == year]
for week in set(tmp.week):
temp = tmp[tmp.week == week]
print(temp[temp.weekday == temp.weekday.min()]) # begining of week
print(temp[temp.weekday == temp.weekday.max()]) # ending of week
This results in:
DatetimeIndex(['2023-02-21'], dtype='datetime64[ns]', freq=None)
DatetimeIndex(['2023-02-24'], dtype='datetime64[ns]', freq=None)
But also gives a "FutureWarning: weekofyear and week have been deprecated ..."
Is there any way to get this in the datetime format so if I printed it, it would say 2023-02-21 for example. How can I avoid the FutureWarning?
(BTW I had sourced some of this from https://stackoverflow.com/a/43674721/21292653
答案1
得分: 0
代替 tmp.week
,你应该尝试使用 pd.Index(tmp.isocalendar().week)
,即:
import pandas as pd
import datetime as dt
from pandas.tseries.holiday import USFederalHolidayCalendar
end = dt.datetime.now()
start = dt.datetime(end.year, end.month, end.day-5)
dr = pd.date_range(start=start, end=end)
cal = USFederalHolidayCalendar()
holidays = cal.holidays(start=dr.min(), end=dr.max())
A = dr[~dr.isin(holidays)]
B = A[A.weekday != 5]
B = B[B.weekday != 6]
for year in set(B.year):
tmp = B[B.year == year]
for week in set(pd.Index(tmp.isocalendar().week)):
temp = tmp[pd.Index(tmp.isocalendar().week) == week]
print(temp[temp.weekday == temp.weekday.min()]) # 一周的开始
print(temp[temp.weekday == temp.weekday.max()]) # 一周的结束
英文:
Instead of tmp.week
, you should try pd.Index(tmp.isocalendar().week)
that is:
import pandas as pd
import datetime as dt
from pandas.tseries.holiday import USFederalHolidayCalendar
end = dt.datetime.now()
start = dt.datetime(end.year, end.month, end.day-5)
dr = pd.date_range(start=start, end=end)
cal = USFederalHolidayCalendar()
holidays = cal.holidays(start=dr.min(), end=dr.max())
A = dr[~dr.isin(holidays)]
B = A[A.weekday != 5]
B = B[B.weekday != 6]
for year in set(B.year):
tmp = B[B.year == year]
for week in set(pd.Index(tmp.isocalendar().week)):
temp = tmp[pd.Index(tmp.isocalendar().week) == week]
print(temp[temp.weekday == temp.weekday.min()]) # begining of week
print(temp[temp.weekday == temp.weekday.max()]) # ending of week
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论