【问题标题】:Get all YEAR and WEEK combinations between a given date and today in pandas在熊猫中获取给定日期和今天之间的所有 YEAR 和 WEEK 组合
【发布时间】:2021-11-04 11:38:12
【问题描述】:

我正在尝试在 pandas 中获取给定日期和今天之间所有 YEAR 和 WEEK 组合的列表。

我几乎成功了,但是 pandas dt.year 和 dt.week 没有返回日期“2019-12-31”的所需值。

根据上述方法是 YEAR=2019 和 WEEK=1,而它应该返回 YEAR=2020 和 WEEK=1。

改进以下代码以解决前一年发生的这种 WEEK=1 的情况的最佳方法是什么?

import datetime
from datetime import date
import pandas as pd
base = datetime.date.today()
d1=date(2019,1,1)
delta=base-d1

monday1 = (base - datetime.timedelta(days=base.weekday()))
monday2 = (d1 - datetime.timedelta(days=d1.weekday()))
number_of_weeks_between = int((monday1 - monday2).days / 7)

date_list = [base - datetime.timedelta(days=x*7) for x in range(number_of_weeks_between+1)]
date_list = pd.DataFrame(date_list, columns =['Date'])
date_list['Date'] = date_list['Date'].astype('datetime64[ns]')
date_list['YEAR'] = date_list['Date'].dt.year
date_list['WEEK'] = date_list['Date'].dt.week

编辑:以下代码按预期工作:

import datetime
from datetime import date
import pandas as pd
base = datetime.date.today()
d1=date(2019,1,1)
delta=base-d1

monday1 = (base - datetime.timedelta(days=base.weekday()))
monday2 = (d1 - datetime.timedelta(days=d1.weekday()))
number_of_weeks_between = int((monday1 - monday2).days / 7)

date_list = [base - datetime.timedelta(days=x*7) for x in range(number_of_weeks_between+1)]
year_list = [x.isocalendar()[0] for x in date_list]
month_list = [x.isocalendar()[1] for x in date_list]
date_list = pd.DataFrame(
          {'Date': date_list,
           'YEAR': year_list,
           'MONTH': month_list
                         })
date_list['Date'] = date_list['Date'].astype('datetime64[ns]')

【问题讨论】:

标签: python pandas


【解决方案1】:

要获得“2019-12-31”的 YEAR=2020 和 WEEK=1,您可以尝试将 ISO 日历年和周替换为以下代码的最后 2 行:

date_list['YEAR'] = date_list['Date'].dt.isocalendar().year
date_list['WEEK'] = date_list['Date'].dt.isocalendar().week

结果:

date_list[date_list['Date'] == '2019-12-31']


         Date  YEAR  WEEK
88 2019-12-31  2020     1

【讨论】:

  • 你的两行替换不起作用(我遇到了一个错误),但我以不同的方式使用了 isocalendar() 并且它起作用了(见编辑),所以谢谢你的帮助。
  • @Cowboy_Owl 哦,真的吗?我复制了您的代码并使用修改后的 2 行运行以达到我在此处显示的结果。也许我们的编程环境之间存在其他一些设置差异。不管怎样,你很高兴根据这里的提示想出了一个适合你的修改代码。
猜你喜欢
  • 2019-11-07
  • 2021-09-14
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多