【问题标题】:Group by and fill missing datetime values with duplicates分组并用重复项填充缺失的日期时间值
【发布时间】:2019-12-17 11:28:05
【问题描述】:

这个问题来自这个:Group by and fill missing datetime values

我只是想按合同对 Pandas 数据框进行分组,检查是否有重复的日期时间值并填写这些值。如果有重复,一共是 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...]

非常感谢。

【问题讨论】:

  • 您需要列表吗?
  • 是的,所以如果我订购了所有的日期时间,我可以使用 lambda 函数创建一个列表,基本问题是在有重复的日期时间时获取我的所有日​​期时间。
  • 您能否给出您期望的示例输出的完整摘要,替换省略号
  • 在第一行(第一个合约)我们将有 25 个值在列表中,因为有两个小时重复,同时在第二个合约中我们将有 24 个值,因为没有小时重复。

标签: python pandas dataframe


【解决方案1】:

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

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())

最后按contract 分组,日期和用chain.from_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

【讨论】:

    【解决方案2】:

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

    df['datetime'] = pd.to_datetime(df['datetime'], format='%Y-%m-%d')

    然后从那里分组。

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

    【讨论】:

      猜你喜欢
      • 2020-04-08
      • 1970-01-01
      • 2020-12-07
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-28
      • 1970-01-01
      相关资源
      最近更新 更多