在Python中对日期范围进行分组
我有以下db,我想将PAS_日期分组为3天,例如表格2015-03-06至2015-03-09在Python中对日期范围进行分组,python,python-2.7,python-3.x,pandas,Python,Python 2.7,Python 3.x,Pandas,我有以下db,我想将PAS_日期分组为3天,例如表格2015-03-06至2015-03-09 PAS_DATE RED_DATE TOT 2015-03-06 2015-03-07 2 2015-03-17 14 2015-12-22 1 2015-03-07 2015-03-08 3 2015-03-19 6 2015-10-14
PAS_DATE RED_DATE TOT
2015-03-06 2015-03-07 2
2015-03-17 14
2015-12-22 1
2015-03-07 2015-03-08 3
2015-03-19 6
2015-10-14 2
2015-12-07 1
2015-03-08 2015-09-16 8
2015-03-09 2015-03-09 7
2015-03-15 6
2015-03-18 8
2015-04-04 15
2015-04-12 19
2015-05-04 44
2015-08-17 5
2015-09-09 13
2015-12-06 3
2015-12-13 3
2015-03-10 2015-03-10 7
输出应为:
PAS_DATE RED_DATE TOT
2015-03-09 2015-03-07 2
2015-03-17 14
2015-12-22 1
2015-03-08 3
2015-03-19 6
2015-10-14 2
2015-12-07 1
2015-09-16 8
2015-03-09 7
2015-03-15 6
2015-03-18 8
2015-04-04 15
2015-04-12 19
2015-05-04 44
2015-08-17 5
2015-09-09 13
2015-12-06 3
2015-12-13 3
2015-03-12 2015-03-10 7
有没有一种方法可以在不使用Pandas或Python进行迭代的情况下执行此代码?我不知道,这是否比使用iterrows()进行循环更有效,但这里有一种方法(好吧,这是一种黑客方法):
PAS_DATE dt_since_first shift for_group_by
0 2015-01-01 0 2 days 2015-01-03
1 2015-01-02 1 1 days 2015-01-03
2 2015-01-03 2 0 days 2015-01-03
3 2015-01-04 3 2 days 2015-01-06
4 2015-01-05 4 1 days 2015-01-06
5 2015-01-06 5 0 days 2015-01-06
6 2015-01-07 6 2 days 2015-01-09
7 2015-01-08 7 1 days 2015-01-09
8 2015-01-09 8 0 days 2015-01-09
9 2015-01-10 9 2 days 2015-01-12
您可以在同一列上迭代执行,我只是在每个步骤中使用不同的列,以便于理解
编辑以供评论
我猜,您的列PAS_DATE是dtype=object,尽管您的条目是dtype=np.datetime[64]。有一些强有力的理由,为什么这应该避免
我曾经在很长一段时间内遇到过这种情况,直到我意识到这一点,我经历了地狱。有各种各样的例外,我花了无数的时间在Stackoverflow上试图解决我的问题。而且,一切都很慢,最重要的是,保存df所需的内存非常大
发生了什么事。您的列的类型为dtype=object,这意味着它只包含指向大型datetime对象集合的指针。如果它是dtype=np.datetime[64],它将只保存64位的datetime信息
尝试查看信息,它应该是这样的:
print df.info()
Output:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 10 entries, 0 to 9
Data columns (total 4 columns):
PAS_DATE 10 non-null datetime64[ns]
dt_since_first 10 non-null int64
shift 10 non-null timedelta64[ns]
for_group_by 10 non-null datetime64[ns]
dtypes: datetime64[ns](2), int64(1), timedelta64[ns](1)
memory usage: 400.0 bytes
顺便说一句,您应该在代码中尽快这样做。而且可能也应该对其他日期列执行此操作。在转换前后执行df.info()。告诉我们,内存使用率之间的区别是什么。没有迭代?你是说根本没有任何循环构造吗?是的,我有一个大的数据集,循环构造很慢……不管怎样,你都必须迭代行来评估数据。循环是任何处理集合或编程的核心构造之一。我尝试了您有趣的解决方案,但我得到了df['for_group_by']=df.PAS_DATE+df['shift']:ufunc add不能使用dtype('O')和dtype类型的操作数('我已经更新了我的原始答案。这不是你的代码的问题。Panda's是处理类似问题的一种很好的方法,但它仍然是迭代的。迭代现在在Panda包中完成,以便将数据映射到索引数据框中。这样做的想法是“不迭代”从根本上说是有缺陷的。在某一点上,数据集必须被拆分成行,并且每一行都必须以某种方式进行评估,无论是通过它们的实际内容还是它们与其他行的关系的元数据进行评估。@tlastowka您当然是对的。这仅仅是因为相同的操作被多次执行(字面上是针对每一行),肯定会有循环。实际上有两个循环,因为我的代码需要在数据帧上迭代多次。不过,现在这是矢量化的,numpy以高度优化的方式进行操作。我想它速度更快,但也需要更多内存。
print df.info()
Output:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 10 entries, 0 to 9
Data columns (total 4 columns):
PAS_DATE 10 non-null datetime64[ns]
dt_since_first 10 non-null int64
shift 10 non-null timedelta64[ns]
for_group_by 10 non-null datetime64[ns]
dtypes: datetime64[ns](2), int64(1), timedelta64[ns](1)
memory usage: 400.0 bytes
df.PAS_DATE = df.PAS_DATE.convert_objects(convert_dates='coerce')