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 的比较