Python将时间戳与输入时间进行比较

Posted

技术标签:

【中文标题】Python将时间戳与输入时间进行比较【英文标题】:Python compare timestamp to input time 【发布时间】:2017-07-02 00:00:56 【问题描述】:

我有一些以时间戳为列的数据框,我想使用 np.where 过滤 8:00:00 到 17:00:00 之间的行。我不断收到有关数据/对象类型的错误消息。任何帮助将不胜感激

示例:

timestamp    volume
2013-03-01 07:59:00    5
2013-03-01 08:00:00    6
2013-03-01 08:01:00    7
2013-03-01 08:02:00    8

基本上我想结束:

2013-03-01 08:00:00    6
2013-03-01 08:01:00    7
2013-03-01 08:02:00    8

通过使用沿线的方法

np.where(df['timestamp'] > dt.time('8:00:00')

【问题讨论】:

发布您收到的错误消息:它们通常会告诉您您做错了什么。 df['timestamp'].dtpye 是什么? 如果第二行应该进入结果集,您将需要使用>=。此外,df[df.timestamp > '08:00:00'] 应该可以工作,无论 dtype 是对象还是日期时间。 df.set_index('timestamp').between_time('08:00','17:00').reset_index()? df['timestamp'].dtype 显示 dtype('O')。我尝试了 df[df.timestamp > '08:00:00'] 但没有运气 - 表返回空数据框 np.where(df['timestamp'] > dt.time('8:00:00') 产生: TypeError:描述符“时间”需要一个“datetime.datetime”对象但收到一个“str” 【参考方案1】:

试试这个:

In [226]: df
Out[226]:
             timestamp  volume
0  2013-03-01 07:59:00       5
1  2013-03-01 08:00:00       6
2  2013-03-01 08:01:00       7
3  2013-03-01 08:02:00       8

In [227]: df.dtypes
Out[227]:
timestamp    object
volume        int64
dtype: object

In [228]: df['timestamp'] = pd.to_datetime(df['timestamp'], errors='coerce')

In [229]: df.dtypes
Out[229]:
timestamp    datetime64[ns]  # <---- it's `datetime64[ns]` now
volume                int64
dtype: object

In [230]: df.set_index('timestamp').between_time('08:00','17:00').reset_index()
Out[230]:
            timestamp  volume
0 2013-03-01 08:00:00       6
1 2013-03-01 08:01:00       7
2 2013-03-01 08:02:00       8

【讨论】:

我能够运行此程序,直到我查看结果数据透视表并看到 8:00:00 之前的时间。我的数据包含多天,所以我想知道这是否可行?我将生成的数据打印到 csv 中,仍然可以看到此期间之外的时间戳。 我的错误,忘记设置要更新的数据框。这很好用。【参考方案2】:

您可以使用between

我用

生成了一个示例数据框
import datetime
d = 'timestamp': pd.Series([datetime.datetime.now() + 
          datetime.timedelta(hours=i) for i in range(20)]),
    'volume': pd.Series([s for s in range(20)])
df = pd.DataFrame(d)

df['timeframe']

0    2017-02-13 22:37:54.515840
1    2017-02-13 23:37:54.515859
2    2017-02-14 00:37:54.515865
3    2017-02-14 01:37:54.515870
4    2017-02-14 02:37:54.515878
5    2017-02-14 03:37:54.515884
6    2017-02-14 04:37:54.515888
...
17   2017-02-14 15:37:54.515939
18   2017-02-14 16:37:54.515943
19   2017-02-14 17:37:54.515948

df.dtypes

timestamp    datetime64[ns]
volume                int64
dtype: object

如您的示例中dtype 中的df['timestamp']object,您可以这样做

df['timestamp'] = pd.to_datetime(df['timestamp'], coerce=True)

通过设置参数coerce=True,如果任何特定字符串的转换失败,那么这些行将设置为NaT

然后可以使用between进行过滤,如下所示

df[df.timestamp.dt.strftime('%H:%M:%S').between('11:00:00','18:00:00')] 将返回

13 2017-02-14 11:37:54.515922      13
14 2017-02-14 12:37:54.515926      14
15 2017-02-14 13:37:54.515930      15
16 2017-02-14 14:37:54.515935      16
17 2017-02-14 15:37:54.515939      17
18 2017-02-14 16:37:54.515943      18
19 2017-02-14 17:37:54.515948      19

【讨论】:

它不起作用,因为我的时间戳 dtype 是对象而不是 datetime64[ns]。出现错误:只能将 .dt 访问器与 datetimelike 值一起使用 过滤前可以试试df['date time'] = pd.to_datetime(df['timestamp'], coerce=True)吗?【参考方案3】:

如果您有一个包含以下数据的文件: 时间戳卷 2013-03-01 07:59:00 5 2013-03-01 08:00:00 6 2013-03-01 08:01:00 7 2013-03-01 08:02:00 8

然后在只读时你可以跳过第一行,你会得到输出 时间戳卷 2013-03-01 08:00:00 6 2013-03-01 08:01:00 7 2013-03-01 08:02:00 8

import pandas as pd
df=pd.read_csv("filename",skiprows=1)
print(df)

【讨论】:

以上是关于Python将时间戳与输入时间进行比较的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Unix 纪元时间戳与 SQL 中的 DATE 进行比较?

Android Studio Firestore 时间戳与 currentLocalTime 的比较

SQL:将时间戳与仅时间参数相匹配,以对多天的唯一时间进行分组和计数

Python获取秒级时间戳与毫秒级时间戳

Python时间戳与日期的相互转化

时间戳与时间差