熊猫的日期范围为yyyy-ww返回“无法将字符串转换为时间戳”

时间:2019-05-27 12:44:55

标签: python pandas

我有一个包含两列的数据框; SalesDate

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周为止。

2 个答案:

答案 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")