【问题标题】:how to convert monthly data to weekly data keeping the other columns constant如何将每月数据转换为每周数据,保持其他列不变
【发布时间】:2020-11-04 13:23:56
【问题描述】:

我有一个如下的数据框。

pd.DataFrame({'Date':['2020-08-01','2020-08-01','2020-09-01'],'value':[10,12,9],'item':['a','d','b']})

我想将此转换为每周数据,使所有列与日期列常量分开。

预期输出

pd.DataFrame({'Date':['2020-08-01','2020-08-08','2020-08-15','2020-08-22','2020-08-29','2020-08-01','2020-08-08','2020-08-15','2020-08-22','2020-08-29','2020-09-01','2020-09-08','2020-09-15','2020-09-22','2020-09-29'],
          'value':[10,10,10,10,10,12,12,12,12,12,9,9,9,9,9],'item':['a','a','a','a','a','d','d','d','d','d','b','b','b','b','b']})

它应该能够将任何月份数据转换为每周数据。输入数据框中的日期始终是该月的第一天。 我该如何做到这一点? 提前致谢。

【问题讨论】:

  • 要从每月行变为每周行,您必须选择类似 7d 的时间段进行重新采样,如果该特定答案不能解决您的问题,只需搜索 "pandas resample"

标签: python pandas datetime


【解决方案1】:

由于所需的新日期时间索引不规则(每月 1 日重新开始),因此可以选择迭代创建索引:

df = pd.DataFrame({'Date':['2020-08-01','2020-09-01'],'value':[10,9],'item':['a','b']})

df = df.set_index(pd.to_datetime(df['Date'])).drop(columns='Date')

dti = pd.to_datetime([]) # start with an empty datetime index
for month in df.index: # for each month, add a 7-day step datetime index to the previous
    dti = dti.union(pd.date_range(month, month+pd.DateOffset(months=1), freq='7d'))

# just reindex and forward-fill, no resampling needed
df = df.reindex(dti).ffill()
df
            value item
2020-08-01   10.0    a
2020-08-08   10.0    a
2020-08-15   10.0    a
2020-08-22   10.0    a
2020-08-29   10.0    a
2020-09-01    9.0    b
2020-09-08    9.0    b
2020-09-15    9.0    b
2020-09-22    9.0    b
2020-09-29    9.0    b

【讨论】:

  • 我已经用额外的输入行编辑了带有预期输出的问题。我的期望在这里有点不同。我想将每月数据重新采样为每周数据。@MrFuppes
  • 但我无法使用 pandas.resample 方法获得所需的输出。
  • @Naseef - 进行了编辑,让我知道这是否适合您。
  • 嘿,我已经编辑了这个问题。在这种情况下,我收到“ValueError: cannot reindex from a duplicate axis”。我想这是因为我们有两个具有相同日期的项目。我该如何解决这个问题?
  • @Naseef:这很痛苦 ^^ - 当然,如果您在日期列中有重复条目,则不能使用我描述的索引方法,因为它需要唯一的日期时间值。您必须添加时间或其他内容,不确定重新采样是否也有效。
【解决方案2】:

我在您的数据中又添加了一个日期,然后使用了resample

df = pd.DataFrame({'Date':['2020-08-01', '2020-09-01'],'value':[10, 9],'item':['a', 'b']})

df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)
df = df.resample('W').ffill().reset_index()
print(df)


        Date  value item
0 2020-08-02     10    a
1 2020-08-09     10    a
2 2020-08-16     10    a
3 2020-08-23     10    a
4 2020-08-30     10    a
5 2020-09-06      9    b

【讨论】:

  • 如果再添加一个日期,则对应的行也应该转换为每周数据。这不是在这里发生吗?这是为什么呢?
  • 如果添加更多日期,则需要重新采样。基本上,再次运行代码。但是为什么不只是添加所有日期然后重新采样。 @Naseef
  • 我已经用预期的输出编辑了这个问题。@Vishnudev@NYC Coder
猜你喜欢
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 2023-03-08
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
相关资源
最近更新 更多