gpt4 book ai didi

python - 多索引——访问每天最后一次

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

Pandas 中的多索引新手。我有这样的数据

Date        Time      value
2014-01-14 12:00:04 .424
12:01:12 .342
12:01:19 .341
...
12:05:49 .23
2014-05-12 ...
1:02:42 .23
....

现在,我想访问每个日期的最后时间并将值存储在某个数组中。我做了一个像这样的多索引

df= pd.read_csv("df.csv",index_col=0)
df.index = pd.to_datetime(df.index,infer_datetime_format=True)
df.index = pd.MultiIndex.from_arrays([df.index.date,df.index.time],names=['Date','Time'])

df= df[~df.index.duplicated(keep='first')]
dates = df.index.get_level_values(0)

所以我将日期保存为数组。我想遍历日期,但无法获得正确的语法或错误地访问值。我已经尝试了一个 for 循环,但无法让它运行(for date in dates)并且也无法直接访问(df.loc[dates[i]] 或类似的东西)。每个日期中时间变量的数量也不同。有什么办法可以解决这个问题吗?

最佳答案

这听起来像是一个groupby/max 操作。更具体地说,您希望按 Date 分组并通过采用 max 聚合 Time。由于只能对 值进行聚合,因此我们需要将 Time 索引级别更改为列(通过使用 reset_index):

import pandas as pd

df = pd.DataFrame({'Date': ['2014-01-14', '2014-01-14', '2014-01-14', '2014-01-14', '2014-05-12', '2014-05-12'], 'Time': ['12:00:04', '12:01:12', '12:01:19', '12:05:49', '01:01:59', '01:02:42'], 'value': [0.42399999999999999, 0.34200000000000003, 0.34100000000000003, 0.23000000000000001, 0.0, 0.23000000000000001]})
df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index(['Date', 'Time'])

df = df.reset_index('Time', drop=False)
max_times = df.groupby(level=0)['Time'].max()
print(max_times)

产量

Date
2014-01-14 12:05:49
2014-05-12 1:02:42
Name: Time, dtype: object

如果您希望选择整行,那么您可以使用idxmax——但有一个警告。 idxmax 返回索引标签。因此,索引必须是唯一的,标签才能表示唯一的行。由于 Date 级别本身不是唯一的,要使用 idxmax 我们需要完全 reset_index(以创建唯一整数的索引) :

df = pd.DataFrame({'Date': ['2014-01-14', '2014-01-14', '2014-01-14', '2014-01-14', '2014-05-12', '2014-05-12'], 'Time': ['12:00:04', '12:01:12', '12:01:19', '12:05:49', '01:01:59', '1:02:42'], 'value': [0.42399999999999999, 0.34200000000000003, 0.34100000000000003, 0.23000000000000001, 0.0, 0.23000000000000001]})
df['Date'] = pd.to_datetime(df['Date'])
df['Time'] = pd.to_timedelta(df['Time'])
df = df.set_index(['Date', 'Time'])

df = df.reset_index()
idx = df.groupby(['Date'])['Time'].idxmax()
print(df.loc[idx])

产量

        Date     Time  value
3 2014-01-14 12:05:49 0.23
5 2014-05-12 01:02:42 0.23

在保留 MultiIndex 的同时,我没有看到执行此操作的好方法。在设置 MultiIndex 之前执行 groupby 操作更容易。此外,将日期时间保留为一个值可能比将其分成两部分更可取。请注意,给定一个类似日期时间/周期的系列,.dt accessor使您可以根据需要轻松访问日期时间。因此,您可以按 Date 进行分组,而无需创建 Date 列:

df = pd.DataFrame({'DateTime': ['2014-01-14 12:00:04', '2014-01-14 12:01:12', '2014-01-14 12:01:19', '2014-01-14 12:05:49', '2014-05-12 01:01:59', '2014-05-12 01:02:42'], 'value': [0.42399999999999999, 0.34200000000000003, 0.34100000000000003, 0.23000000000000001, 0.0, 0.23000000000000001]})
df['DateTime'] = pd.to_datetime(df['DateTime'])
# df = pd.read_csv('df.csv', parse_dates=[0])

idx = df.groupby(df['DateTime'].dt.date)['DateTime'].idxmax()
result = df.loc[idx]
print(result)

产量

             DateTime  value
3 2014-01-14 12:05:49 0.23
5 2014-05-12 01:02:42 0.23

关于python - 多索引——访问每天最后一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38513649/

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