Python 分组依据并用重复项填充缺少的日期时间值

Python 分组依据并用重复项填充缺少的日期时间值,python,pandas,dataframe,Python,Pandas,Dataframe,这个问题来自于这个问题: 我只是想把一个数据帧按合同分组,检查是否有重复的日期时间值,然后填充这些值。如果有重复,则总共有25小时,如果没有,则为24小时 我的意见是: contract datetime value1 value2 x 2019-01-01 00:00:00 50 60 x 2019-01-01 02:00:00 30

这个问题来自于这个问题:

我只是想把一个数据帧按合同分组,检查是否有重复的日期时间值,然后填充这些值。如果有重复,则总共有25小时,如果没有,则为24小时

我的意见是:

contract         datetime             value1          value2
   x       2019-01-01 00:00:00          50              60
   x       2019-01-01 02:00:00          30              60
   x       2019-01-01 02:00:00          70              80
   x       2019-01-01 03:00:00          70              80
   y       2019-01-01 00:00:00          30              100
使用此数据帧,我的输出应该如下所示:

contract         date              value1                     value2
   x           2019-01-01    [50,NaN,30,70,70,NaN,Nan...]    [60, NaN, Nan...]
   y           2019-01-01    [30, NaN, Nan...]               [100, NaN, NaN...]

非常感谢。

如果我理解正确,我认为这可能有用:

df['datetime']=pd.to_datetime(df['datetime'],格式=“%Y-%m-%d”)

那就从那里开始


(完全公开,我没有仔细检查,但我认为这是获得YYYY-MM-DD的适当格式)此外,为了避免混淆,可能值得将
['datetime']
重命名为其他名称。

如果我理解正确,我认为这可能会起作用:

df['datetime']=pd.to_datetime(df['datetime'],格式=“%Y-%m-%d”)

那就从那里开始


(完全公开,我没有仔细检查,但我认为这是获得YYYY-MM-DD的适当格式)此外,为了避免混淆,可能值得将
['datetime']
重命名为其他名称。

想法是首先创建列表,以便可能使用以前的解决方案:

df['datetime'] = pd.to_datetime(df['datetime'])

df = df.groupby(['contract','datetime']).agg(list)

f= lambda x: x.reindex(pd.date_range(x.index.min().floor('d'),
                                     x.index.max().floor('d')+pd.Timedelta(23, 'H'),
                                     freq='H', name='datetime'))
df1 = (df.reset_index('contract')
         .groupby('contract')['value1','value2']
         .apply(f)
         .reset_index())
最后按
合同
和日期分组,并用
链展平列表。从\u iterable

from  itertools import chain

df2 = (df1.groupby(['contract', df1['datetime'].dt.date])
         .agg(lambda x: list(chain.from_iterable(y if y==y else [y] for y in x)))
         .reset_index()
         )
print (df2)
  contract    datetime                                             value1  \
0        x  2019-01-01  [50, nan, 30, 70, 70, nan, nan, nan, nan, nan,...   
1        y  2019-01-01  [30, nan, nan, nan, nan, nan, nan, nan, nan, n...   

                                              value2  
0  [60, nan, 60, 80, 80, nan, nan, nan, nan, nan,...  
1  [100, nan, nan, nan, nan, nan, nan, nan, nan, ...  
测试长度:

print (df2[['value1','value2']].applymap(len))
   value1  value2
0      25      25
1      24      24

想法是首先创建可能使用的列表以前的解决方案:

df['datetime'] = pd.to_datetime(df['datetime'])

df = df.groupby(['contract','datetime']).agg(list)

f= lambda x: x.reindex(pd.date_range(x.index.min().floor('d'),
                                     x.index.max().floor('d')+pd.Timedelta(23, 'H'),
                                     freq='H', name='datetime'))
df1 = (df.reset_index('contract')
         .groupby('contract')['value1','value2']
         .apply(f)
         .reset_index())
最后按
合同
和日期分组,并用
链展平列表。从\u iterable

from  itertools import chain

df2 = (df1.groupby(['contract', df1['datetime'].dt.date])
         .agg(lambda x: list(chain.from_iterable(y if y==y else [y] for y in x)))
         .reset_index()
         )
print (df2)
  contract    datetime                                             value1  \
0        x  2019-01-01  [50, nan, 30, 70, 70, nan, nan, nan, nan, nan,...   
1        y  2019-01-01  [30, nan, nan, nan, nan, nan, nan, nan, nan, n...   

                                              value2  
0  [60, nan, 60, 80, 80, nan, nan, nan, nan, nan,...  
1  [100, nan, nan, nan, nan, nan, nan, nan, nan, ...  
测试长度:

print (df2[['value1','value2']].applymap(len))
   value1  value2
0      25      25
1      24      24

您需要列表吗?是的,因此,如果我对所有日期时间进行了排序,我可以使用lambda函数创建一个列表,基本问题是当存在重复的日期时间时,获取所有日期时间。您能否给出示例中预期的输出的完整摘要,替换第一行(第一个合同)中的Elipsin,列表中将有25个值,因为复制了两个小时,同时在第二个合同中,我们将有24个值,因为没有复制的小时。您需要列表吗?是的,因此如果我对所有日期时间进行了排序,我可以使用lambda函数创建一个列表,基本问题是在有重复的日期时间时获取我的所有日期时间。您能否给出示例中预期的输出的完整摘要,替换Elipsin在第一行(第一个合同)中,列表中有25个值,因为有两个小时重复,而在第二个合同中,我们将有24个值,因为没有时间重复。