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

2024-01-10

我有一个包含两列的数据框;Sales and 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 (e.g. 2015-06-01) to yyyy-ww (e.g. 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 周。


我认为问题是要创建最少的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')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pandas 日期范围返回 yyyy-ww 的“无法将字符串转换为时间戳” 的相关文章

随机推荐