首页 > 解决方案 > 如何从一年中的一周计算一个月的一周?

问题描述

我找到了node.js解决方案,但找不到 python 解决方案。我有一个DataFrame看起来像:

   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
 .   .      .        .      .
 .   .      .        .      .
 .   .      .        .      .

标签: pythonpandasdatecalendartime-series

解决方案


我找到了一个相对冗长且丑陋的解决方案,似乎可行。如果有错误/错误或更清晰的实现,请告诉我。

我的方法:使用示例 2011 July 30 2608

  1. 获取相应年份相应月份的周数
m = list(calendar.month_name).index('July') # turn month name into int
cal = calendar.Calendar()
weeks = cal.monthdatescalendar(2011,7) # get weeks for that month in the year
  1. 获取您正在处理的一年中的每个星期。在我们的例子中2011

yr = cal.yeardatescalendar(2011, width=12)

此代码将获取年份并将其存储在 4D 列表中:month-junk(在我们的例子中是 12 个月的 1 个垃圾)、月、周、日。yr[0][6][4][:]要查询,请对 7 月的第 5 周的所有日子执行类似操作。正因为如此,下一步就是把它变成一个可以保存所有星期的二维数组。

flat = [week for month in yr[0] for week in month]
dates = np.array(flat)

由于返回列表的方式,这dates将保留重复项。cal.yeardatescalendar()我们删除这些:

new_dates = []
for date in range(len(dates)):
    if not(np.array_equal(dates[date], np.array(dates[date-1]))):
        new_dates.append(dates[date])

此时,您有一个与您的周数一致的 2D 周数组。就像如果你去这里,检查周302011你会看到它是七月的第 5 周。

  1. 接下来,我们使用“正确的”周列表数组来查询我们的周。前任。星期30

the_week = new_dates[:][30]

  1. 最后,我们会看到一个月中的哪一周是我们的一周。当我们得到匹配时,我们知道它是那个周数。
for week in range(len(weeks)): 
    if np.array_equal(the_week, np.array(weeks[week])):
        save_week_num = week+1
        print(save_week_num) # for our example it will print 5

这是一个函数:

def week_of_month(year, month, y_week):
    m = list(calendar.month_name).index(month) 
    cal = calendar.Calendar()
    weeks = cal.monthdatescalendar(year,m) 

    yr = cal.yeardatescalendar(year, width=12)
    flat = [week for month in yr[0] for week in month]
    dates = np.array(flat)

    new_dates = []
    for date in range(len(dates)):
        if not(np.array_equal(dates[date], np.array(dates[date-1]))):
            new_dates.append(dates[date])

    the_week = new_dates[:][y_week] # for 2013, replace this with: the_week = new_dates[:][y_week-1] 

    number = 0
    for week in range(len(weeks)):

        if np.array_equal(the_week, np.array(weeks[week])):

            save_week_num = week+1
            number = save_week_num

    return number

DataFrame在问题运行中对其进行测试:

df['Week'] = df.apply(lambda row: week_of_month(row.Year, row.Month, row.Week), axis=1)


推荐阅读