Python 如何从一年中的一周计算一个月中的一周?
我找到了一个解决方案,但找不到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
数据帧
,看起来像:
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)#获得一年中该月的周数
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