我知道这个问题已经问了几十遍了,我已经尝试了使用多维数组的直觉(here,here),但我不知道过程。
使用Calendar库中的yeardatescalendar()
,我得到了几天,几周,几个月的时间,这些数据打包成4D列表。
import calendar
cal = calendar.Calendar()
yr_11 = cal.yeardatescalendar(2011)
返回值是月份行的列表。每个月行最多包含3个月。每个月包含4至6周,每个星期包含1至7天。
我正在尝试将其转换为2D数组,所以这只是几周的清单。但是,即使我尝试执行此操作,我也无法理解输出。
# create an array
arr = np.array(yr_11)
arr.ndim # this returns '2'
arr.shape # this returns (4,3)
# yr_11 holds 63 weeks, so I tried to reshape
new_array = arr.reshape(63,1)
但是它会引发错误:ValueError: cannot reshape array of size 12 into shape (63,1)
有人可以解释发生了什么并将其转换为2D数组吗?
编辑:本质上我正在寻找这个
[[datetime.date(2010, 12, 27),
datetime.date(2010, 12, 28),
datetime.date(2010, 12, 29),
datetime.date(2010, 12, 30),
datetime.date(2010, 12, 31),
datetime.date(2011, 1, 1),
datetime.date(2011, 1, 2)],
[datetime.date(2011, 1, 3),
datetime.date(2011, 1, 4),
datetime.date(2011, 1, 5),
datetime.date(2011, 1, 6),
datetime.date(2011, 1, 7),
datetime.date(2011, 1, 8),
datetime.date(2011, 1, 9)], ... ]
答案 0 :(得分:1)
list
返回的嵌套yeardatescalendar
具有以下层次结构:
因此,例如,yr_11[2][1][3][2]
将给datetime
表示第三块中第二个月第二周第四天的第三天。请记住,索引从左(最不嵌套)到右(最嵌套),但是我们通常以相反的方向(最细的优先)读取此类元素。
为简化计算,我们可以传递width=12
,以便我们的结果由一个包含12个月的块组成。
接下来,仅需展平list
并将结果传递给np.array
:
import calendar
cal = calendar.Calendar()
yr_11 = cal.yeardatescalendar(2011, width=12)
flat = [day for month in yr_11[0] for week in month for day in week]
dates = np.array(flat)
print(dates)
输出:
[datetime.date(2010, 12, 27) datetime.date(2010, 12, 28)
datetime.date(2010, 12, 29) datetime.date(2010, 12, 30)
datetime.date(2010, 12, 31) datetime.date(2011, 1, 1)
...
datetime.date(2011, 12, 28) datetime.date(2011, 12, 29)
datetime.date(2011, 12, 30) datetime.date(2011, 12, 31)
datetime.date(2012, 1, 1)]