【问题标题】:Creating time series DataFrame from event data从事件数据创建时间序列 DataFrame
【发布时间】:2015-08-18 14:04:12
【问题描述】:

我有一个商店位置数据集,其中包含事件日期(所有库存从该商店售出的日期)和售出商品的数量,如下所示:

import numpy as np, pandas as pd

# Dates
start = pd.Timestamp("2014-02-26")
end = pd.Timestamp("2014-09-24")

# Generate some data
N = 1000
quantA = np.random.randint(10, 500, N)
quantB = np.random.randint(50, 250, N)
sell = np.random.randint(start.value, end.value, N)
sell = pd.to_datetime(np.array(sell, dtype="datetime64[ns]"))

df = pd.DataFrame({"sell_date": sell, "quantityA":quantA, "quantityB":quantB})
df.index = df.sell_date

我想创建一个新的时间序列数据框,其中包含来自这些数量 A 和 B 的范围内的每周摘要(或每天;或每个自定义 date_range 对象)。

我可以根据这些生成周数和总销售额,就像这样......

df['week'] = df.sell_date.dt.week
df.pivot_table(values = ['quantityA', 'quantityB'], index = 'week', aggfunc = [np.sum, len])

但我不知道如何执行以下操作:

  1. 将此扩展为完整的时间序列(基于 date_range 对象,例如 period_range = pd.date_range(start = start, end = end, freq='7D')),
  2. 包括原始日期(作为“周开始”变量),而不是整数周数,或
  3. 将日期变量更改为这个新数据框的索引。

【问题讨论】:

    标签: python datetime pandas


    【解决方案1】:

    我不确定这是否是你想要的,但你可以试试

    df.set_index('sell_date', inplace=True) 
    resampled = df.resample('7D', [sum, len])
    

    生成的索引可能不是您想要的,因为它以精确到纳秒的最早日期时间开始。您可以通过执行替换为时间为 00:00:00 的日期时间

    resampled.index = pd.to_datetime(resampled.index.date)
    

    编辑:

    其实你可以这样做

        resampled = df.resample('W', [sum, len])
    

    结果索引正是您想要的。有趣的是,传递'D' 也会给出您期望的索引,但是传递像'2D' 这样的倍数会导致“丑陋”索引,也就是说,从最早的正确到纳秒开始,并以恰好2 天的倍数增加。我想这个教训是尽可能坚持像“D”、“W”、“M”这样的单曲。

    编辑: 重新采样的 API 在某些时候发生了更改,因此上述内容不再有效。相反,可以这样做:

    resampled = df.resample('W').agg([sum, len])
    

    .resample 现在返回一个公开方法的Resampler 对象,很像groupbyAPI。

    【讨论】:

    • 太好了,谢谢。为了完整起见,我已将df.index = df.sell_date 添加到我的答案中,然后您的答案完全有效。
    • 对如何使用自定义 date_range 执行此操作有任何想法吗?例如,如果我想要 2014 年全年的每周总结?
    • 您可以通过将“W”替换为您想要的任何内容来设置时间段。为了限制范围,您可以做各种事情,但我认为df.loc['20140101': '20141231'].resample... 在这种情况下是最干净的。当您说整个 2014 年时,您是指作为同一更大数据集的子集吗?在您的示例中,数据仅限于 2014 年。
    • 认为我找到了我想要的东西,我的意思是... period_range = pd.date_range(start = '2014-01-01', end = '2014-12-13', freq='7D'); resampled = df.resample('D', [sum, len]); resampled.reindex(period_range) 感谢您的帮助!非常感谢!
    • 你确定这是你想要的吗?这将给出距离“2014-01-01”一周的日期的每日总和,即一年中的所有星期三。它没有给出每周的总和。
    猜你喜欢
    • 2017-09-28
    • 2019-10-17
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 2020-03-17
    • 2023-03-22
    相关资源
    最近更新 更多