首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于日期时间的熊猫数据选择

基于日期时间的熊猫数据选择
EN

Stack Overflow用户
提问于 2020-03-27 14:43:49
回答 1查看 1.6K关注 0票数 2

我试图创建某种“功能选择”,让用户能够灵活地创建配置,以选择熊猫数据中的数据。然而,我遇到了一些令我困惑的问题。

以下是一个简化的示例:

代码语言:javascript
运行
复制
>>> import pandas as pd
>>> df = pd.DataFrame({'date': pd.date_range(start='2020-01-01', periods=4), 'val': [1, 2, 3, 4]})
>>> df
        date  val
0 2020-01-01    1
1 2020-01-02    2
2 2020-01-03    3
3 2020-01-04    4

问题1:当我以不同的方式在列上应用函数时,为什么得到不同的结果?

代码语言:javascript
运行
复制
>>> import datetime
>>> bydatetime = lambda x : x == datetime.date(2020, 1, 1)
>>> bydatetime(df['date'])
0    False
1    False
2    False
3    False
Name: date, dtype: bool
>>> df['date'].apply(bydatetime) # why does this one work?
0     True
1    False
2    False
3    False
Name: date, dtype: bool

然而,如果我使用numpy的datetime64或熊猫的Timestamp类型来创建lambda函数,它就会工作。

代码语言:javascript
运行
复制
>>> import numpy as np
>>> bynpdatetime = lambda x : x == np.datetime64('2020-01-01')
>>> bynpdatetime(df['date'])
0     True
1    False
2    False
3    False
Name: date, dtype: bool
>>> df['date'].apply(bynpdatetime)
0     True
1    False
2    False
3    False
Name: date, dtype: bool
>>> bypdtimestamp = lambda x : x == pd.Timestamp('2020-01-01')
>>> bypdtimestamp(df['date'])
0     True
1    False
2    False
3    False
Name: date, dtype: bool
>>> df['date'].apply(bypdtimestamp)
0     True
1    False
2    False
3    False
Name: date, dtype: bool

因此,我返回到使用以下简单的选择,并且使用datetime.date无效。如果datetime.date不能工作,为什么df['date'].apply(bydatetime)会工作呢?

代码语言:javascript
运行
复制
>>> df[df['date'] == datetime.date(2020, 1, 1)]
Empty DataFrame
Columns: [date, val]
Index: []
>>> df[df['date'] == np.datetime64('2020-01-01')]
        date  val
0 2020-01-01    1
>>> df[df['date'] == pd.Timestamp('2020-01-01')]
        date  val
0 2020-01-01    1

最后但并非最不重要的是,为什么选择一个单元格时,datedatetime64在DataFrame但Timestamp中的类型?他们之间到底有什么区别?

代码语言:javascript
运行
复制
>>> df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype         
---  ------  --------------  -----         
 0   date    4 non-null      datetime64[ns]
 1   val     4 non-null      int64         
dtypes: datetime64[ns](1), int64(1)
memory usage: 192.0 bytes
>>>
>>> df['date'][0]
Timestamp('2020-01-01 00:00:00')

我相信这里有一些基本的东西我不明白。非常感谢您所做的一切建设性的工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-27 14:51:21

幸运的是,我有一个较早版本的pandas (0.25),您在执行bynpdatetime(df['date'])时会收到警告,这正好解释了为什么会看到这种行为。关于如何处理这件事,有一些反复的讨论。,因此看到这个行为将是高度特定于版本的:

FutureWarning:将一系列日期时间与'datetime.date‘进行比较。目前,“datetime.date”被胁迫到日期时间。在未来,熊猫不会强迫,并且‘值将不等于'datetime.date'.为了保持当前的行为,将'datetime.date’转换成一个带有‘pd.Time戳’的日期时间。

pandas是建立在np.datetime64np.timedelta64 d类型之上的。您不应该使用datetime模块,因为它们已经做出了与标准库不一致的某些选择。所有的意外行为都是因为这一点。

回答另一个与此无关的问题。datetime64类似于数组类型,或概念。该数组(在本例中为pd.Series)将由标量timedelta64对象组成。这在文档中得到了解释。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60888277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档