Python 与熊猫的每日频率计数

Python 与熊猫的每日频率计数,python,count,pandas,Python,Count,Pandas,我已经问过了,这次我试着每天都做同样的计算。因此,我希望这一次计算一周的下限值在周一设置了多少次,在周二设置了多少次,等等,然后将一周中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

我已经问过了,这次我试着每天都做同样的计算。因此,我希望这一次计算一周的下限值在周一设置了多少次,在周二设置了多少次,等等,然后将一周中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行)中将重采样更改为“W”,在第6行将其更改为“D”,则会出现以下错误:KeyError:Timestamp('2013-01-01 00:00',tz=None)

有人能帮忙吗?我相信这很简单,但熊猫医生帮不了我。 即使有人有不使用熊猫的解决方案,也要给我看看。如果行得通就行了。
谢谢

您可以按周使用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
注:指数为周末

使用您提供的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”,然后是星期二、星期三等。看起来更好,我看到您的代码只给了我一周最低值的所有星期天。这很奇怪,因为在我的数据中只有周一到周五的数据!如果您想提供线索,也许可以查看我的文件。@user3142367第5列和第6列没有出现(因为数据集中没有周六或周日),第6列将对应于一周的最后一天(并用作索引)。