Python 如何从一年中的一周计算一个月中的一周?

Python 如何从一年中的一周计算一个月中的一周?,python,pandas,date,calendar,time-series,Python,Pandas,Date,Calendar,Time Series,我找到了一个解决方案,但找不到python解决方案。我有一个数据帧,看起来像: Year Month Week numOfTrips 0 2011 July 30 2608 1 2011 August 31 6852 2 2011 August 32 8092 3 2011 August 33 7674 4 2011 August 34 7065 5 2011 August

我找到了一个解决方案,但找不到python解决方案。我有一个
数据帧
,看起来像:

   Year  Month      Week  numOfTrips
0  2011  July       30    2608
1  2011  August     31    6852
2  2011  August     32    8092
3  2011  August     33    7674
4  2011  August     34    7065
5  2011  August     35    3896
6  2011  September  35    4182
7  2011  September  36    7315
8  2011  September  37    8929
9  2011  September  38    7822
10 2011  September  39    6508
11 2011  October    39    1848
12 2011  October    40    9233
13 2011  October    41    7818
14 2011  October    42    7627
 .   .      .        .      .
 .   .      .        .      .
 .   .      .        .      .
我想用那个月的周数替换每个周数,我该怎么做

结果如下:

   Year  Month      Week  numOfTrips
0  2011  July       5     2608
1  2011  August     1     6852
2  2011  August     2     8092
3  2011  August     3     7674
4  2011  August     4     7065
5  2011  August     5     3896
6  2011  September  1     4182
7  2011  September  2    7315
8  2011  September  3    8929
9  2011  September  4    7822
10 2011  September  5    6508
11 2011  October    1    1848
12 2011  October    2    9233
13 2011  October    3    7818
14 2011  October    4    7627
 .   .      .        .      .
 .   .      .        .      .
 .   .      .        .      .
我们可以做到以下几点: 首先,我们将您的
+
转换为使用
pandas.to_datetime

from datetime import datetime as dt

df['Date'] = pd.to_datetime(df['Year'].astype(str) + '-' + df['Week'].astype(str) + '-1', format='%Y-%W-%w')

然后,我们定义以下注释中提到的函数:


最后,我们将函数应用于我们的
日期
列,以获得月份的
周数

df['Week'] = df['Date'].apply(week_of_month)

这将产生:

print(df)
   Year      Month  Week  numOfTrips       Date
0  2011       July     5        2608 2011-07-25
1  2011     August     1        6852 2011-08-01
2  2011     August     2        8092 2011-08-08
3  2011     August     3        7674 2011-08-15
4  2011     August     4        7065 2011-08-22
5  2011     August     5        3896 2011-08-29
6  2011  September     5        4182 2011-08-29

注意最后一行不是100%准确,因为您没有准确的日期。如果我们有准确的日期,这将是100%准确的。

我发现了一个相对较长且丑陋的解决方案,似乎有效。如果有错误/bug或更干净的实现,请告诉我

我的方法:使用示例
2011年7月30日2608

  • 获取相应年份中相应月份的周数
  • m=list(calendar.month_name.index('July')#将月份名称转换为int
    cal=calendar.calendar()
    weeks=cal.monthdatescalendar(2011,7)#获得一年中该月的周数
    
  • 在你要处理的一年中,每周都做一次。在我们的示例中,its
    2011
  • yr=cal.yeardatescalendar(2011,宽度=12)

    此代码将获取年份并将其存储在4D列表中:month junk(在本例中是12个月的1个junk)、month、week、day。要查询,请对7月第5周的所有日期执行类似于
    yr[0][6][4][:]
    的操作。因此,下一步是将其转换为一个2D数组,该数组保存所有周

    flat=[年中月中周[0]月中周]
    日期=np.数组(平面)
    
    由于
    cal.yeardatescalendar()
    返回列表的方式,此
    日期将保留重复项。我们删除这些:

    new_dates=[]
    对于范围内的日期(len(dates)):
    如果不是(np.array_equal(dates[date],np.array(dates[date-1])):
    新增日期。追加(日期[日期])
    
    此时,您有一个与周数对齐的二维周数组。如果你去查看2011年的第30周,你会发现这是7月的第5周

  • 接下来,我们使用“正确的”周列表数组来查询我们的周。例如一周<代码>30
  • 每周=新的日期[:][30]

  • 最后,我们看看哪个星期是一个月中的一周。当我们得到一场比赛,我们知道这是第几周
  • 范围内的周数(len(周)):
    如果np.array_等于(周,np.array(周[周]):
    保存周数=周数+1
    打印(保存周数)#对于我们的示例,它将打印5
    
    这是一个函数:

    def周/月(年、月、年/周):
    m=列表(日历.月份\名称).索引(月份)
    cal=calendar.calendar()
    周=校准月日期(年,m)
    年=校准年日期校准年(年,宽度=12)
    单位=[年内月内周[0]月内周]
    日期=np.数组(平面)
    新日期=[]
    对于范围内的日期(len(dates)):
    如果不是(np.array_equal(dates[date],np.array(dates[date-1])):
    新增日期。追加(日期[日期])
    _周=新_日期[:][y_周]#对于2013年,将其替换为:_周=新_日期[:][y_周-1]
    数字=0
    对于范围内的周(len(周)):
    如果np.array_等于(周,np.array(周[周]):
    保存周数=周数+1
    编号=保存周数
    返回号码
    
    要在问题运行中的
    数据帧上测试它,请执行以下操作:


    df['Week']=df.apply(lambda行:Week\u of_month(row.Year,row.month,row.Week),axis=1)

    将数据转换为
    日期
    对象,然后检查以下答案:@DroidX86您的意思是
    日期时间
    ?就像在
    df['Week']=pd.to_datetime(df.Week)
    中一样,是的,试试看。获取日期信息的最佳方法是使用实际的
    datetime
    对象。对于任何仍在试图弄清楚这一点的人(如我):这些周数是“一年中的第几周”,返回的确切日期是什么意思?如果9月的第39周也是第5周,则2011年9月的第35周不能是第5周……我们从
    +
    中提取了
    日期
    列。如您所见,我们的
    Date
    列只能在周级别上准确,而不能在日级别上准确。这就是为什么第5行和第6行的日期相同。好吧,我把你的评论解释为我没有足够的数据来进行准确的计算。在等式中使用
    Month
    ,我应该能够得到正确的一周。这就是我现在要做的。你看过我的答案了吗?那你可能更明白我的意思
    print(df)
       Year      Month  Week  numOfTrips       Date
    0  2011       July     5        2608 2011-07-25
    1  2011     August     1        6852 2011-08-01
    2  2011     August     2        8092 2011-08-08
    3  2011     August     3        7674 2011-08-15
    4  2011     August     4        7065 2011-08-22
    5  2011     August     5        3896 2011-08-29
    6  2011  September     5        4182 2011-08-29