根据日期时间在熊猫数据框中选择数据

时间:2020-03-27 14:43:49

标签: python pandas datetime

我正在尝试创建某种“功能选择”,使用户可以灵活地创建配置以选择熊猫数据框中的数据。但是,我遇到了一些困扰我的问题。

以下是一个简化的示例:

>>> 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: 为什么我在列上应用不同的函数时会得到不同的结果?

>>> 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函数,它将起作用。

>>> 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)可以正常工作?

>>> 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

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

>>> 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')

我确信这里有些根本不了解的事情。非常感谢您所做的建设性工作。

1 个答案:

答案 0 :(得分:3)

幸运的是,我有一个较旧的pandas版本(0.25),当您执行bynpdatetime(df['date'])时会收到警告,它确切地解释了为什么您看到这种行为。 There was a bit of back and forth on how to handle this,因此看到此行为将是高度特定于版本的:

FutureWarning:将一系列日期时间与“ datetime.date”进行比较。 当前,“ datetime.date”被强制为日期时间。在将来 大熊猫不会强制使用,并且“这些值的比较不能等于 'datetime.date'。要保留当前行为,请将 将“ datetime.date”更改为带有“ pd.Timestamp”的日期时间。

Datetime functionality in pandas基于np.datetime64np.timedelta64 dtypes。 您不应使用datetime模块,因为它们做出的某些选择与标准库不一致。所有的意外行为都是由于这个原因。


回答其他不相关的问题。 datetime64类似于数组类型或概念。该数组(在这种情况下为pd.Series)将由标量timedelta64对象组成。 documentation

中对此进行了说明