Python pandas.resample()在某些示例中不起作用。为什么? 问题: 我希望Pandas.resample()方法的结果具有两级索引。正如您可以在下面的示例中看到的,对good\u example\u df的重新采样产生2级索引。 当我将index\u list的第二个元素从datetime(2020,1,2,12,39,59)更改为datetime(2020,1,3,12,39,59)时,.resample()方法只给我一级索引。该示例用坏的\u示例\u df给出。这是我不想发生的事情。 如何使.resample()方法的结果始终具有2级索引,就像好的示例所做的那样? 我问这个问题的原因是我希望重采样方法的结果是一致的。我不希望方法的结果因输入的不同而有所不同 代码示例

Python pandas.resample()在某些示例中不起作用。为什么? 问题: 我希望Pandas.resample()方法的结果具有两级索引。正如您可以在下面的示例中看到的,对good\u example\u df的重新采样产生2级索引。 当我将index\u list的第二个元素从datetime(2020,1,2,12,39,59)更改为datetime(2020,1,3,12,39,59)时,.resample()方法只给我一级索引。该示例用坏的\u示例\u df给出。这是我不想发生的事情。 如何使.resample()方法的结果始终具有2级索引,就像好的示例所做的那样? 我问这个问题的原因是我希望重采样方法的结果是一致的。我不希望方法的结果因输入的不同而有所不同 代码示例,python,pandas,date,datetime,pandas-resample,Python,Pandas,Date,Datetime,Pandas Resample,您的输出基本上是相同的数据,但有一个额外的索引,时间四舍五入到天如果这正是您想要实现的目标,请不要使用重新采样。 您不需要它,只需重置索引即可: In[]: bad_example_df.set_index([bad_example_df.index.floor('D'), bad_example_df.index]) Out[]: return stock 2020-01-02 2020-01-02 02:43:59 1.0

您的输出基本上是相同的数据,但有一个额外的索引,时间四舍五入到天如果这正是您想要实现的目标,请不要使用
重新采样
。 您不需要它,只需重置索引即可:

In[]:
bad_example_df.set_index([bad_example_df.index.floor('D'), bad_example_df.index])

Out[]:
                                return stock
2020-01-02 2020-01-02 02:43:59   1.003  AMZN
2020-01-03 2020-01-03 12:39:59   1.020  APPL
           2020-01-03 21:42:59   1.060  NVDA
2020-01-04 2020-01-04 02:53:59   1.020  MSFT
           2020-01-04 19:17:59   1.030  AMZN

OTOH,您的
lambda
使它看起来好像您正在尝试获取每天的前两个值。如果是这样的话,我认为
apply
不是您想要使用的(大概是
resample().apply()
迭代方式的b/c)。请注意,如果将第一个日期更改为1月1日,则会得到更糟糕的意外输出:

In[]:
third_index_list = [datetime(2020,1,1,2,43,59), datetime(2020,1,2,12,39,59),datetime(2020,1,3,21,42,59),
              datetime(2020,1,4,2,53,59), datetime(2020,1,4,19,17,59)]

terrible_example_df = pd.DataFrame(data = data_dict, index = third_index_list)
terrible_example_df.resample("D").apply(lambda x: x[:2])

Out[]:
                  return         stock
2020-01-01         1.003          AMZN
2020-01-02          1.02          APPL
2020-01-03          1.06          NVDA
2020-01-04  [1.02, 1.03]  [MSFT, AMZN]
#now the dtype is object and lots of operations will fail!
因此,我认为您的
好的示例\u df
恰好给出了预期的输出,而您的
坏的示例\u df
恰好给出了意外但仍然有效的输出,但这两种情况都可能是对
重采样().apply()的不当使用。TBH我不明白在每个示例中,
apply
有什么不同之处

相反,它看起来像是使用
groupby
groupby().apply()
(不同于重采样
apply
!)可以始终如一地为您提供所需的输出(据我所知):


还有TBH,我不明白为什么要创建两个索引,但它似乎是有效的

我认为
bad\u示例\u df
具有预期的输出。重采样用于聚合时间序列中的值。如果希望有两个索引,则不需要使用重采样。我的观点是,如果您想要类似于
好的\u example\u df
的输出,则不需要重新采样。@Reza我希望
.resample()
方法能给我一个一致的输出,并且我更希望结果与好的示例方法一致。我基于.resample方法创建了一个函数,如果它现在给我两种类型的结果,我的项目就不能继续了。在
好的例子\u df
中,没有聚合,对吗?您有5行作为输入,5行作为输出。因此,您不需要使用
.resample()
.groupby(pd.Grouper(freq='D'))
之间有什么区别?对于
.datetime
数据,我个人更喜欢使用
.resample()
而不是
.groupby()
。但是这两种方法有什么区别呢?简短的回答:我不确定。我可以让你问一个类似的问题。我至少记录了它们的一些不同之处,cs95给出了一个很好的评论。
resample
的文档将其作为一种“方便的方法”——它最终在某种意义上实现了
groupby
。我同意你的看法,重新取样似乎更友好。我认为
groupby
可以更好地执行更深奥的聚合操作,尽管
resample
对于向上或向下采样可能更清晰。因此,在这种情况下,您可以执行
df.groupby(df.index.date)
,这是
pd.Grouper
的更可读的替代方法
In[]:
third_index_list = [datetime(2020,1,1,2,43,59), datetime(2020,1,2,12,39,59),datetime(2020,1,3,21,42,59),
              datetime(2020,1,4,2,53,59), datetime(2020,1,4,19,17,59)]

terrible_example_df = pd.DataFrame(data = data_dict, index = third_index_list)
terrible_example_df.resample("D").apply(lambda x: x[:2])

Out[]:
                  return         stock
2020-01-01         1.003          AMZN
2020-01-02          1.02          APPL
2020-01-03          1.06          NVDA
2020-01-04  [1.02, 1.03]  [MSFT, AMZN]
#now the dtype is object and lots of operations will fail!
In[]:
bad_example_df.groupby(pd.Grouper(freq='D')).apply(lambda x: x[:2])

Out[]: 
                                return stock
2020-01-02 2020-01-02 02:43:59   1.003  AMZN
2020-01-03 2020-01-03 12:39:59   1.020  APPL
           2020-01-03 21:42:59   1.060  NVDA
2020-01-04 2020-01-04 02:53:59   1.020  MSFT
           2020-01-04 19:17:59   1.030  AMZN
#works for terrible_example_df as well