gpt4 book ai didi

python - 无法使用 dataframe.loc 提取通过 dataframe.series 添加列创建的数据框

转载 作者:太空宇宙 更新时间:2023-11-03 15:32:44 25 4
gpt4 key购买 nike

我从解析 json 得到如下数据框:

                Date          Close  
0 2019-04-01T02:00:00Z 999.7
1 2019-04-01T02:01:00Z 999.6
2 2019-04-01T02:02:00Z 999.5
....
14811 2019-06-28T07:45:00Z 999.9
[14812 rows x 3 columns]

我使用下面的代码将它们分成两列,分别称为“日期”和“时间”:

data = json.loads(data_source)
df=pd.DataFrame.from_dict(data)
date=df['Date']
list_date=[]
list_time=[]
for item in date:
item=re.split('\b|[T,Z]',item)
date=item[0:1]
list_date.append(date)
time=item[1:2]
list_time.append(time)
df2['Time']=pd.Series(list_time)
df2['Day']=pd.Series(list_date)
df2['Close']=df['Close']

如果我打印 df2,我会收到这样的结果:

                Day        Time   Close  
0 [2019-04-01] [02:00:00] 999.7
1 [2019-04-01] [02:01:00] 999.6
2 [2019-04-01] [02:02:00] 999.5
....
14811 [2019-06-28] [07:45:00] 999.9
[14812 rows x 3 columns]

现在,我想通过以下方式提取子数据框:

data_sub=df2.loc[df2['Day']=='2019-06-28']

但结果只是:

Empty DataFrame
Columns: [Day, Time, Close]
Index: []

我不知道为什么在通过向数据框添加列表来添加更多列后无法提取 df2。

请为我解释何时/为什么我在执行 print(dataframe) 时收到 [value] 和 value(不带 [])形式的数据。如上,print(original dataframe)-->接收不带[]的值形式的日期(例如:2019-04-01T02:00:00Z)

但是当 print(df2) 以 [] 的形式给出日期和时间数据时(例如:[2019-04-01] [02:00:00])

最佳答案

使用to_datetimeSeries.dt.tz_convert对于日期时间和时间 Series.dt.time , 对于 date 使用 Series.dt.floor删除过滤时间:

df['Date'] = pd.to_datetime(df['Date']).dt.tz_convert(None)
df['Time'] = df['Date'].dt.time
#possible, but problem wit hfiltering
#df['Day'] = df['Date'].dt.date
df['Day'] = df['Date'].dt.floor('d')
print (df)
Date Close Time Day
0 2019-04-01 02:00:00 999.7 02:00:00 2019-04-01
1 2019-04-01 02:01:00 999.6 02:01:00 2019-04-01
2 2019-04-01 02:02:00 999.5 02:02:00 2019-04-01

data_sub=df.loc[df['Day']=='2019-04-01']
print (data_sub)
Date Close Time Day
0 2019-04-01 02:00:00 999.7 02:00:00 2019-04-01
1 2019-04-01 02:01:00 999.6 02:01:00 2019-04-01
2 2019-04-01 02:02:00 999.5 02:02:00 2019-04-01

在我看来这里可以创建DatetimeIndex:

df['Date'] = pd.to_datetime(df['Date']).dt.tz_convert(None)
df = df.set_index('Date')
print (df)
Close
Date
2019-04-01 02:00:00 999.7
2019-04-01 02:01:00 999.6
2019-04-01 02:02:00 999.5

所以可能使用indexing如果需要按时间过滤,请使用 DataFrame.at_time :

print (df['2019-04-01'])
Close
Date
2019-04-01 02:00:00 999.7
2019-04-01 02:01:00 999.6
2019-04-01 02:02:00 999.5

print (df.at_time('02:00:00'))
Close
Date
2019-04-01 02:00:00 999.7

编辑:

我认为在您的解决方案中创建了一个项目列表,因此对于 select 来说,必须对列表中的标量使用索引 .str[0]:

print(df2['Day'].str[0])

data_sub=df2.loc[df2['Day'].str[0]=='2019-06-28']

EDIT1 - 在第一个解决方案中按时间选择:

from datetime import time
data_sub=df[df['Time']==time(2,0,0)]
print (data_sub)
Date Close Time
0 2019-04-01 02:00:00 999.7 02:00:00

t = time(2,0,0)
data_sub=df.query('Time == @t')
print (data_sub)
Date Close Time
0 2019-04-01 02:00:00 999.7 02:00:00

关于python - 无法使用 dataframe.loc 提取通过 dataframe.series 添加列创建的数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57016287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com