【问题标题】:Daily frequency count with pandas熊猫的每日频率计数
【发布时间】:2014-02-05 20:33:17
【问题描述】:

As in this question 我已经问过了,这次我试着做同样的计数,但每天都做。所以我希望这次计算一下在星期一设置了多少次一周的较低值,在星期二设置了多少次等,并获得一周中 7 天的汇总计数 获取这样的日期和值列表:

2013.01.01,00:00,1.31802

2013.01.02,00:00,1.32038

2013.01.03,00:00,1.31859

2013.01.04,00:00,1.30508

等等

我目前正在为此使用 Pandas,我用来计算每小时的代码是:

df = pd.read_csv(myPath, sep=',', header=None, parse_dates=[[0, 1]])
df.columns = ["date","value"]
df.set_index("date", inplace=True)
day_min = df.resample('D', how='min')
df['is_day_min'] = day_min.lookup(df.index.normalize(), len(df) * ['value'])==df.value
df.is_day_min.resample('H', np.sum).fillna(0).astype(int)    
df.groupby(df.index.time)["is_day_max"].sum().to_csv("C:\\2013frequency_min.csv")

但是在分析每日数据时,如果我在 day_min(第 4 行)中将 resample 更改为“W”,在第 6 行更改为“D”,则会出现以下错误:KeyError: Timestamp('2013-01-01 00 :00:00', tz=None)

有人可以帮忙吗?我敢肯定这很简单,但熊猫文档并没有帮助我。 即使有人有不使用熊猫的解决方案,也可以向我展示。如果它有效,那没关系。 谢谢

【问题讨论】:

    标签: python count pandas


    【解决方案1】:

    您可以按周使用 TimeGrouper(并查看该值是否等于该周的最小值),然后按天重新采样:

    In [11]: week = df.groupby(pd.TimeGrouper('W'))
    
    In [12]: is_week_min = week['value'].apply(lambda x: x == x.min()).astype(int)  # possibly the astype is not needed in 0.13
    
    In [13]: is_week_min.resample('D', how='sum')  # count occurences in the day which are week min
    Out[13]: 
    2013-01-01    0
    2013-01-02    0
    2013-01-03    0
    2013-01-04    1
    Freq: D, dtype: int64
    

    如果您希望将其作为每周几天的列,您可以在应用程序中执行 groupby:

    In [14]: week['value'].apply(lambda x: ((x == x.min()).astype(int).groupby(x.index.dayofweek)).sum()).unstack(1)
    Out[14]: 
                1  2  3  4
    2013-01-06  0  0  0  1
    

    注意:索引是 WeekEnd。

    并使用您提供的 pastebin 链接:

    In [21]: df = pd.read_csv('http://pastebin.com/raw.php?i=SuyWZLj5', header=None, parse_dates=[[0, 1]])
             df.columns = ['date', 'value']
             df.set_index('date', inplace=True)
    
    In [22]: df.groupby(pd.TimeGrouper('W')).value.apply(lambda x: ((x == x.min()).astype(int).groupby(x.index.dayofweek)).sum()).unstack(1)
    Out[22]: 
                 0  1  2  3   4
    2013-01-06 NaN  0  0  0   1
    2013-01-13   0  0  0  1   0
    2013-01-20   0  0  0  1   0
    2013-01-27   1  0  0  0   0
    2013-02-03   0  1  0  0   0
    2013-02-10   0  0  0  0   1
    2013-02-17   0  0  0  0   1
    2013-02-24   0  0  0  0   1
    2013-03-03   0  0  1  0 NaN
    

    【讨论】:

    • 是的。有用。但是,如果我只需要从 1 到 7 表示一周中的几天的索引上显示的计数(将所有数据框的结果分组在一周内)怎么办?
    • @user3142367 也许 df.groupby(pd.TimeGrouper('W')).value.apply(lambda x: ((x == x.min()).astype(int).groupby (x.index.day)).sum()).unstack(1)
    • 您很乐意为我的问题抽出时间。但是通过这种方式,您建议它给我一个月中的天数。我需要的是“我们在星期一有 4 倍的一周最低值,所以我们在星期一(或第 1 天)加上 4”,以此类推,星期二、星期三等。
    • 看起来更好,我看到你的代码给了我一周中最低的日子,只是所有的星期天。这很奇怪,因为在我的数据中只有周一到周五的数据!如果您想提供线索,也许您可​​以查看我在pastebin.com/SuyWZLj5 的文件。
    • @user3142367 第 5 列和第 6 列不会出现(因为数据集中没有星期六或星期日),第 6 列对应于一周的最后一天(并用作索引)。
    猜你喜欢
    • 2018-07-24
    • 1970-01-01
    • 2017-05-28
    • 2020-08-25
    • 2015-03-05
    • 2020-12-08
    • 2019-05-26
    • 2018-03-28
    • 1970-01-01
    相关资源
    最近更新 更多