我认为问题是要创建最少的dataset["Date"]
由格式中的字符串填充的列YYYY-VV
。但为了传递到date_range
需要格式YYYY-MM-DD
或日期时间对象。
I found this https://docs.python.org/3.6/library/datetime.html#strftime-and-strptime-behavior:
为了方便起见,还包含了 C89 标准不需要的几个附加指令。这些参数均对应于 ISO 8601 日期值。当与 strftime() 方法一起使用时,这些可能不适用于所有平台。 ISO 8601 年和 ISO 8601 周指令不能与上述年份和周数指令互换。使用不完整或不明确的 ISO 8601 指令调用 strptime() 将引发 ValueError。
%VISO 8601 周为十进制数,星期一为一周的第一天。第 01 周是包含 1 月 4 日的那一周。
Pandas 0.24.2 错误YYYY-VV
format:
dataset = pd.DataFrame({'Date':['2015-06-01','2015-06-02']})
dataset["Date"] = pd.to_datetime(dataset["Date"]).dt.strftime('%Y-%V')
print (dataset)
Date
0 2015-23
1 2015-23
ds = pd.to_datetime(dataset['Date'], format='%Y-%V')
print (ds)
ValueError:“V”是格式“%Y-%V”的错误指令
可能的解决方案是使用%U
或 %W,检查this http://strftime.org/:
%U一年中的周数(星期日为一周的第一天),采用零填充的十进制数。新年第一个星期日之前的所有日子都被视为第 0 周。
%W一年中的周数(星期一为一周的第一天),采用十进制数。新年第一个星期一之前的所有日子都被视为第 0 周。
dataset = pd.DataFrame({'Date':['2015-06-01','2015-06-02']})
dataset["Date"] = pd.to_datetime(dataset["Date"]).dt.strftime('%Y-%U')
print (dataset)
Date
0 2015-22
1 2015-22
ds = pd.to_datetime(dataset['Date'] + '-1', format='%Y-%U-%w')
print (ds)
0 2015-06-01
1 2015-06-01
Name: Date, dtype: datetime64[ns]
或者在日期时间中使用原始 DataFrame 中的数据:
dataset = pd.DataFrame({'Date':['2015-06-01','2015-06-02'],
'Sales':[10,20]})
dataset["Date"] = pd.to_datetime(dataset["Date"])
print (dataset)
Date Sales
0 2015-06-01 10
1 2015-06-02 20
data = dataset.groupby(dataset['Date'].dt.strftime('%Y-%V'))["Sales"].sum().reset_index()
print (data)
Date Sales
0 2015-23 30
num_pred_weeks = 5
ds = data.Date.values
ds_pred = pd.date_range(start=dataset["Date"].min(), periods=len(ds) + num_pred_weeks, freq="W")
print (ds_pred)
DatetimeIndex(['2015-06-07', '2015-06-14', '2015-06-21',
'2015-06-28',
'2015-07-05', '2015-07-12'],
dtype='datetime64[ns]', freq='W-SUN')