Arrays Swift-在一个大的时间范围内按周对一系列项目进行分组
我目前正在从事一个项目,该项目要求我操作一个包含日期和双精度值的对象数组。我能够在一本多年的字典中对其进行分解,然后将这些嵌套数组分解为当年的几个星期。不幸的是,一年中的第一周经常出现在一年中的某一年和接下来的几年中 我想要实现的是一个数组或字典,它包含了分组到每个星期的所有日期以及该组中所有金额的总和 我已经尝试过按Arrays Swift-在一个大的时间范围内按周对一系列项目进行分组,arrays,swift,date,multidimensional-array,mapping,Arrays,Swift,Date,Multidimensional Array,Mapping,我目前正在从事一个项目,该项目要求我操作一个包含日期和双精度值的对象数组。我能够在一本多年的字典中对其进行分解,然后将这些嵌套数组分解为当年的几个星期。不幸的是,一年中的第一周经常出现在一年中的某一年和接下来的几年中 我想要实现的是一个数组或字典,它包含了分组到每个星期的所有日期以及该组中所有金额的总和 我已经尝试过按.weekOfYear对它们进行分组,但这并不考虑年份本身,如果两个日期相隔一年以上,我将始终只有52个条目长的数组 我还研究了通过使用Calendar.current.ordin
.weekOfYear
对它们进行分组,但这并不考虑年份本身,如果两个日期相隔一年以上,我将始终只有52个条目长的数组
我还研究了通过使用Calendar.current.ordinality(of:.weekOfYear,in:.era,for:'date')来使用星期的顺序。
但是它被转换成一个整数,我不知道如何将它返回到一个日期
下面是我在xCode游乐场中使用的代码及其输出的副本
import Foundation
let cal = Calendar.current
extension Date {
var year: Int {
return cal.component(.year, from: self)
}
var week: Int {
return cal.component(.weekOfYear, from: self)
}
var weekAndYear: DateComponents {
return cal.dateComponents([.weekOfYear, .year], from: self)
}
}
struct Item {
var date: Date
var amount: Double
}
let startDate: Date = cal.date(from: DateComponents(year: 2018, month: 12, day: 2))!
let endDate: Date = cal.date(from: DateComponents(year: 2019, month: 1, day: 28))!
// Here I'm creating dummy items for each date between our date range
func setUpItems (startDate: Date, endDate: Date) -> [Item] {
var date = startDate
var inputArray: [Item] = []
let dateCount = cal.dateComponents([.day], from: startDate, to: endDate).day
let valuePerDay: Double = 1000 / Double(dateCount!)
let lowerLim = valuePerDay - (valuePerDay / 2)
let upperLim = valuePerDay + (valuePerDay / 2)
while date < endDate {
let input = Double.random(in: lowerLim...upperLim).rounded()
inputArray.append(Item(
date: date,
amount: input
))
date = cal.date(byAdding: .day, value: 1, to: date)!
}
return inputArray
}
let itemArray = setUpItems(startDate: startDate, endDate: endDate)
let grouppedByYear = Dictionary(grouping: itemArray, by: { $0.date.year })
let grouppedByYearThenWeek = grouppedByYear
.mapValues{(yearArray: [Item]) -> Dictionary<Int, Double> in
return Dictionary(grouping: yearArray, by: { $0.date.week })
.mapValues{ (value: [Item]) in
return value.map{ $0.amount }.reduce(0, +)
}
}
print("Grouped by week")
print(grouppedByYearThenWeek)
我希望最终能有一本字典,不会因为年份的不同而把一周分割开来
[2018: [49: 127.0, 52: 125.0, 50: 119.0, 51: 113.0],
2019: [3: 124.0, 4: 122.0, 5: 19.0, 1: 126.0, 2: 121.0]]
// or potentially
[["49 2018": 127.0, "52 2018": 125.0...],
["3 2019": 124.0, "4 2019": 122.0...]]
任何帮助都将不胜感激
不幸的是,一年中的第一周经常出现在一年中的某一年和接下来的几年中
对。但是如果您要检索一年中的一周,那么使用.year
检索该周是没有意义的。您希望将.yearForWeekOfYear
与.weekOfYear
结合使用:
var weekAndYear: DateComponents {
return cal.dateComponents([.weekOfYear, .yearForWeekOfYear], from: self)
}
var yearForWeekOfYear: Int {
return cal.component(.yearForWeekOfYear, from: self)
}
您可能会发现使用“每周开始”计算属性很有用:
var startOfWeek: Date {
let components = cal.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)
return cal.date(from: components)!
}
归根结底,你想如何对待2018年12月31日。您希望它出现在2019年第1周(就像标准的
weekOfYear
和yearForWeekOfYear
那样),还是希望将其归因于“2018年第53周”。简言之,您是希望将2018年12月30日开始的一周视为一周(上述内容将实现),还是希望将其拆分,将本周的开始视为2018年第53周,将本周的后半部视为2019年第1周?因此2018年12月31日和2019年1月1日在同一周。所以我猜你希望他们在2019年第一周的同一周内出席?也许你可以澄清一下。(我可能建议删除所有这些代码,这些代码只会使问题变得模糊,并将其简化为类似这样的简单内容,即,您希望这两个日期显示在哪一周和哪一年。)
var startOfWeek: Date {
let components = cal.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)
return cal.date(from: components)!
}