熊猫从日期时间戳中获取日期

时间:2014-06-02 22:22:05

标签: python datetime pandas

我正在使用pandas数据框,其中'date_time'列的值看起来像日期时间戳:2014-02-21 17:16:42

我可以使用df ['date_time']调用该列,我想搜索具有特定日期的行。

我一直在努力尝试
df[(df['date_time']=='2014-02-21')]

但我不知道如何从日期时间值中搜索日期。另外,我不确定它是否相关,但是当我检查类型(df.date_time [0])时,它返回字符串,而不是某个日期时间类型对象。

非常感谢。

2 个答案:

答案 0 :(得分:3)

这里更有效不使用字符串(假设这些已经是datetime64 - 您应该这样做!),因为这些必须在比较之前计算 ......而字符串的东西很慢。

In [11]: s = pd.Series(pd.to_datetime(['2014-02-21 17:16:42', '2014-02-22 17:16:42']))

In [12]: s
Out[12]:
0   2014-02-21 17:16:42
1   2014-02-22 17:16:42
dtype: datetime64[ns]

您可以只进行简单的订购检查:

In [13]: (pd.Timestamp('2014-02-21') < s) & (s < pd.Timestamp('2014-02-22'))
Out[13]:
0     True
1    False
dtype: bool

In [14]: s.loc[(pd.Timestamp('2014-02-21') < s) & (s < pd.Timestamp('2014-02-22'))]
Out[14]:
0   2014-02-21 17:16:42
dtype: datetime64[ns]

但是,使用DatetimeIndex.normalize(在每个时间戳的午夜获取时间戳)会更快:

In [15]: pd.DatetimeIndex(s).normalize()
Out[15]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2014-02-21, 2014-02-22]
Length: 2, Freq: None, Timezone: None

In [16]: pd.DatetimeIndex(s).normalize() == pd.Timestamp('2014-02-21')
Out[16]: array([ True, False], dtype=bool)

In [17]: s.loc[pd.DatetimeIndex(s).normalize() == pd.Timestamp('2014-02-21')]
Out[17]:
0   2014-02-21 17:16:42
dtype: datetime64[ns]

这是一些时间(如上所述):

In [21]: %timeit s.loc[s.str.startswith('2014-02-21')]
1000 loops, best of 3: 1.16 ms per loop

In [22]: %timeit s.loc[(pd.Timestamp('2014-02-21') < s) & (s < pd.Timestamp('2014-02-22'))]
1000 loops, best of 3: 1.23 ms per loop

In [23]: %timeit s.loc[pd.DatetimeIndex(s).normalize() == pd.Timestamp('2014-02-21')]
1000 loops, best of 3: 405 µs per loop

稍微大一些,结果更有说服力:

In [31]: s = pd.Series(pd.to_datetime(['2014-02-21 17:16:42', '2014-02-22 17:16:42'] * 1000))

In [32]: %timeit s.loc[s.str.startswith('2014-02-21')]
10 loops, best of 3: 105 ms per loop

In [33]: %timeit s.loc[(pd.Timestamp('2014-02-21') < s) & (s < pd.Timestamp('2014-02-22'))]
1000 loops, best of 3: 1.3 ms per loop

In [34]: %timeit s.loc[pd.DatetimeIndex(s).normalize() == pd.Timestamp('2014-02-21')]
1000 loops, best of 3: 694 µs per loop

注意:在您的示例中,df['date_time']列是s,您将执行df.loc[pd.DatetimeIndex(df['date_time']) == ...]

答案 1 :(得分:0)

因为这是一种刺痛,所以你可以尝试以下方式:

df[df['date_time'].str.startswith('2014-02-21')]