我有一个包含两列的数据框; Sales
和Date
。
dataset.head(10)
Date Sales
0 2015-01-02 34988.0
1 2015-01-03 32809.0
2 2015-01-05 9802.0
3 2015-01-06 15124.0
4 2015-01-07 13553.0
5 2015-01-08 14574.0
6 2015-01-09 20836.0
7 2015-01-10 28825.0
8 2015-01-12 6938.0
9 2015-01-13 11790.0
我想将Date
列从yyyy-mm-dd
(例如2015-06-01
)转换为yyyy-ww
(例如2015-23
),所以我运行下面的代码:
dataset["Date"] = pd.to_datetime(dataset["Date"]).dt.strftime('%Y-%V')
然后我根据周将我的Sales
分组,即
data = dataset.groupby(['Date'])["Sales"].sum().reset_index()
data.head(10)
Date Sales
0 2015-01 67797.0
1 2015-02 102714.0
2 2015-03 107011.0
3 2015-04 121480.0
4 2015-05 148098.0
5 2015-06 132152.0
6 2015-07 133914.0
7 2015-08 136160.0
8 2015-09 185471.0
9 2015-10 190793.0
现在,我要基于Date
列创建日期范围,因为我要根据周预测销售量:
ds = data.Date.values
ds_pred = pd.date_range(start=ds.min(), periods=len(ds) + num_pred_weeks,
freq="W")
但是,我遇到以下错误:could not convert string to Timestamp
,我不确定该如何解决。因此,如果我将2015-01-01
用作日期导入的开始日期,则不会出现任何错误,这使我意识到我在使用错误的函数。但是,我不确定如何?
我希望基本上有一个日期范围,该日期范围从当前周开始,到未来52周为止。
答案 0 :(得分:3)
我认为问题是要创建dataset["Date"]
列的最小值,该列由格式为YYYY-VV
的字符串填充。但要传递给date_range
,则需要格式YYYY-MM-DD
或日期时间对象。
我发现了this:
为方便起见,还包含了C89标准不需要的几个附加指令。这些参数都对应于ISO 8601日期值。当与strftime()方法一起使用时,这些功能可能并非在所有平台上都可用。 ISO 8601年和ISO 8601周指令与上面的年和周编号指令不可互换。使用不完整或不明确的ISO 8601指令调用strptime()会引发ValueError。
%V ISO 8601星期(十进制数字),星期一为一周的第一天。第01周是包含1月4日的一周。
以YYYY-VV
格式的熊猫0.24.2错误:
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:
%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')
答案 1 :(得分:1)
如果ds
包含日期,其日期格式为'2015-01'
(应为'%Y-%W'
(或在日期时间库中为'%G-%V'
),则必须添加天数以获得日期。在这里,假设您想要星期一,您应该:
ds_pred = pd.date_range(start=pd.to_datetime(ds.min() + '-1', format='%Y-%W-%w',
periods=len(ds) + num_pred_weeks, freq="W")