微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python-熊猫从日期时间戳记获取日期

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

我可以使用df [‘date_time’]调用该列,并且我想搜索具有特定日期的行.我一直在尝试一些类似的方法

df[(df['date_time']=='2014-02-21')]

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

非常感谢.

解决方法:

不使用这里的字符串会更有效率(假设它们已经是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

使用稍大的s,结果更能说明问题:

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’])== …].

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐