python - 如何从一年中的一周计算一个月的一周?
问题描述
我找到了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
. . . . .
. . . . .
. . . . .
解决方案
我找到了一个相对冗长且丑陋的解决方案,似乎可行。如果有错误/错误或更清晰的实现,请告诉我。
我的方法:使用示例 2011 July 30 2608
- 获取相应年份相应月份的周数
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
- 获取您正在处理的一年中的每个星期。在我们的例子中
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 周数组。就像如果你去这里,检查周30
,2011
你会看到它是七月的第 5 周。
- 接下来,我们使用“正确的”周列表数组来查询我们的周。前任。星期
30
the_week = new_dates[:][30]
- 最后,我们会看到一个月中的哪一周是我们的一周。当我们得到匹配时,我们知道它是那个周数。
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)
推荐阅读
- ansible - Ansible:增量追加到列表变量
- c# - c#在运行时从外部dll加载继承的类
- ethereum - 调用 super.owner().transfer(msg.value) 给出错误
- flutter - 使用 GestureDetector 捕捉 MaterialButton 孩子的手势
- c++ - 如何有条件地编译模板类的成员函数?
- mysql - 如何在每次上传时选择表中缺少记录的行
- mysql - 可以优化时间属性查询以删除 MAX 子查询吗?
- c++ - 如何让 PyPy 识别线性代数(Intel MKL、OpenBLAS)库?环境变量问题?
- python - Python中高斯函数的傅里叶变换
- java - 如何删除java文件中以特定字符串开头和结尾的特定行?