Python返回时间数据在2个值之间的对应单元格
目前我正在编写一些软件来做数据分析。我的代码有点问题,现在一些数据被错误的时间值破坏了。我希望python找到时间值介于00:00:00和03:59:00之间的数据行,并从同一行返回相应的“Ticker”和“Exchange”值,但不幸的是,我在完成这项工作时遇到问题,希望这里的人能帮我解决 示例数据帧:Python返回时间数据在2个值之间的对应单元格,python,python-3.x,pandas,Python,Python 3.x,Pandas,目前我正在编写一些软件来做数据分析。我的代码有点问题,现在一些数据被错误的时间值破坏了。我希望python找到时间值介于00:00:00和03:59:00之间的数据行,并从同一行返回相应的“Ticker”和“Exchange”值,但不幸的是,我在完成这项工作时遇到问题,希望这里的人能帮我解决 示例数据帧: Ticker Exchange Date Time 0 AAPL NASDAQ 20200501 01:00:00 1 AAPL NASDAQ
Ticker Exchange Date Time
0 AAPL NASDAQ 20200501 01:00:00
1 AAPL NASDAQ 20200501 02:00:00
2 AAPL NASDAQ 20200501 03:00:00
3 AAPL NASDAQ 20200502 01:00:00
4 AAPL NASDAQ 20200502 02:00:00
5 AAPL NASDAQ 20200502 03:00:00
6 TSLA NASDAQ 20200501 05:00:00
7 TSLA NASDAQ 20200501 06:00:00
8 TSLA NASDAQ 20200501 07:00:00
9 TSLA NASDAQ 20200502 05:00:00
10 TSLA NASDAQ 20200502 06:00:00
11 TSLA NASDAQ 20200502 07:00:00
示例输出:
Ticker Exchange
0 AAPL NASDAQ
在这种情况下,“纳斯达克”交易所的“AAPL”股票的时间值介于00:00:00和03:59:00之间,因此python应该将股票代码和交易所返回给我
我希望我能说清楚,这里有人能帮我
复制粘贴的示例代码:
import pandas as pd
df1 = pd.DataFrame({'Ticker': ['AAPL', 'AAPL', 'AAPL', 'AAPL', 'AAPL', 'AAPL','TSLA', 'TSLA', 'TSLA', 'TSLA', 'TSLA', 'TSLA'],
'Exchange': ['NASDAQ','NASDAQ','NASDAQ','NASDAQ','NASDAQ','NASDAQ','NASDAQ','NASDAQ','NASDAQ','NASDAQ','NASDAQ','NASDAQ'],
'Date': [20200501, 20200501, 20200501, 20200502, 20200502, 20200502, 20200501, 20200501, 20200501, 20200502, 20200502, 20200502],
'Time': ['01:00:00','02:00:00','03:00:00','01:00:00','02:00:00','03:00:00','05:00:00','06:00:00','07:00:00','05:00:00','06:00:00','07:00:00',]})
print(df1)
output = pd.DataFrame({'Ticker': ['AAPL'],
'Exchange': ['NASDAQ']})
print(output)
#Code from MaKaNu that results in error: "TypeError: cannot astype a datetimelike from [datetime64[ns]] to [int32]"
minimal = pd.DataFrame({'time': [pd.to_datetime('00:00:00')]})
maximal = pd.DataFrame({'time': [pd.to_datetime('03:59:00')]})
#The lines below give the error
minimal = pd.to_datetime(minimal['time']).astype(int) / 10**9
maximal = pd.to_datetime(maximal['time']).astype(int) / 10**9
df_unix_sec = pd.to_datetime(df1['Time']).astype(int) / 10**9
series = df_unix_sec.between(minimal[0], maximal[0])
result = df1.loc[series == True][['Ticker', 'Exchange']].loc[0]
print(result)
要在两个条件之间进行比较,第一步是从字符串中创建数值。为了保持连续性,我创建了两个小数据帧,其中只有最小值和最大值
minimal=pd.DataFrame({'time':[pd.to_datetime('0:00:00')]))
maximal=pd.DataFrame({'time':[pd.to_datetime('3:59:00')]})
然后使用函数pd.to_datetime
将其设置为整数,并将其除以10的幂9,以创建合理的值
minimal=pd.to_datetime(minimal['time'])。astype(int)/10**9
maximal=pd.to_datetime(maximal['time'])。aType(int)/10**9
下一步是对原始数据帧中的列'Time'
执行相同的操作
df_unix_sec=pd.to_datetime(df1['Time'])。astype(int)/10**9
最后一步,我使用了内置函数between
,并使用minimal
和maximal
中的第一个条目作为参数
print(df_unix_sec.between(最小[0],最大[0]))
我打印的结果是一个带有布尔值的熊猫系列:
0 True
1正确
2正确
3正确
4正确
5对
6错误
7错误
8错误
9错误
10错误
11错误
名称:时间,数据类型:布尔
正如您所见,条件之间的所有值均为真
现在我们只保存这个系列,并将它们用作原始数据帧的掩码
series=df_unix_sec.between(最小[0],最大[0])
打印(df1.loc[series==True])
结果如下所示:
股票交换日期时间
0 AAPL纳斯达克20200501 01:00:00
1 AAPL纳斯达克20200501 02:00:00
2 AAPL纳斯达克20200501 03:00:00
3 AAPL纳斯达克20200502 01:00:00
4 AAPL纳斯达克20200502 02:00:00
5 AAPL纳斯达克20200502 03:00:00
如果您只需要从您的问题中输出示例:
result=df1.loc[series==True][[Ticker',Exchange']].loc[0]
打印(结果)
结果:
Ticker-AAPL
纳斯达克交易所
名称:0,数据类型:对象
要在两个条件之间进行比较,第一步是从字符串中创建数值。为了保持连续性,我创建了两个小数据帧,其中只有最小值和最大值
minimal=pd.DataFrame({'time':[pd.to_datetime('0:00:00')]))
maximal=pd.DataFrame({'time':[pd.to_datetime('3:59:00')]})
然后使用函数pd.to_datetime
将其设置为整数,并将其除以10的幂9,以创建合理的值
minimal=pd.to_datetime(minimal['time'])。astype(int)/10**9
maximal=pd.to_datetime(maximal['time'])。aType(int)/10**9
下一步是对原始数据帧中的列'Time'
执行相同的操作
df_unix_sec=pd.to_datetime(df1['Time'])。astype(int)/10**9
最后一步,我使用了内置函数between
,并使用minimal
和maximal
中的第一个条目作为参数
print(df_unix_sec.between(最小[0],最大[0]))
我打印的结果是一个带有布尔值的熊猫系列:
0 True
1正确
2正确
3正确
4正确
5对
6错误
7错误
8错误
9错误
10错误
11错误
名称:时间,数据类型:布尔
正如您所见,条件之间的所有值均为真
现在我们只保存这个系列,并将它们用作原始数据帧的掩码
series=df_unix_sec.between(最小[0],最大[0])
打印(df1.loc[series==True])
结果如下所示:
股票交换日期时间
0 AAPL纳斯达克20200501 01:00:00
1 AAPL纳斯达克20200501 02:00:00
2 AAPL纳斯达克20200501 03:00:00
3 AAPL纳斯达克20200502 01:00:00
4 AAPL纳斯达克20200502 02:00:00
5 AAPL纳斯达克20200502 03:00:00
如果您只需要从您的问题中输出示例:
result=df1.loc[series==True][[Ticker',Exchange']].loc[0]
打印(结果)
结果:
Ticker-AAPL
纳斯达克交易所
名称:0,数据类型:对象
时间必须在0:00:00到3:59:00之间,这是您的唯一条件吗?谢谢您@MaKaNu的回复。是的,我唯一的标准是行需要包含00:00:00到03:59:00之间的数据。不一定是每分钟一次,此时间段之间的1行数据已经损坏。您的唯一条件是时间必须介于0:00:00和3:59:00之间吗?感谢您的回复@MaKaNu。是的,我唯一的标准是行需要包含00:00:00到03:59:00之间的数据。这不一定是每分钟一次,这一时间段之间的一行数据已经损坏。感谢您的回答@MaKaNu。我知道这是怎么回事。不幸的是,我收到一个错误:“TypeError:无法在尝试将datetime转换为整数值的行中键入从[datetime64[ns]]到[int32]的datetimelike。”。我一直试图解决这个问题,但迄今为止没有成功。你能帮帮我吗?我工作很忙