【问题标题】:User input date shift in PandasPandas 中的用户输入日期偏移
【发布时间】:2022-01-12 02:31:27
【问题描述】:

我有一个数据框 df,我希望用户在其中输入一个整数,该整数将针对给定条件移动特定日期。

数据

         start      m1          m2          de          re          type
0       2018-01-01  2022-01-01  2022-04-01  2022-05-01  2022-06-01  aa
1       2018-01-01  2022-01-01  2022-04-01  2022-05-01  2022-06-01  aa
2       2018-01-01  2022-01-01  2022-04-01  2022-05-01  2022-06-01  bb

希望

     **User input**: 9

        start       m1          m2          de          re          type
0       2018-01-01  2022-10-01  2023-01-01  2023-02-01  2023-03-01  aa
1       2018-01-01  2022-10-01  2023-01-01  2023-02-01  2023-03-01  aa
2       2018-01-01  2022-10-01  2023-01-01  2022-05-01  2022-06-01  bb

#user 输入整数:9。我们现在在 'm2' 列 4+9 中将 9 添加到月份,我们现在是 2023 年 1 月 1 日。

(2022 年 4 月 1 日在“m2”列中。我们在此日期上加上 9 个月,即为 2023 年 1 月 1 日)

正在做

month_value = df["m2"] += pd.DateOffset(months=int(input()))
       
if df[type] == 'aa':  # condition applied
    d = {
      'm1': pd.DateOffset(months=3),  #we offset m1, 3 months from m2
      'de': pd.DateOffset(months=1),
      're': pd.DateOffset(months=2),
    }
        
    s = pd.Series(d).rsub(month_value)
    df.assign(**{**s, 'm2': month_value})
   
else:
    e = {'m1': pd.DateOffset(months=3),}
    s1 = pd.Series(e).rsub(month_value)
    df.assign(**{**s1, 'm2': month_value})

我正在研究。任何建议表示赞赏。

【问题讨论】:

  • 试试 numpy 在哪里?
  • @BENY 将尝试合并 numpy - 你的意思是有条件的?

标签: python pandas numpy input


【解决方案1】:

您可以为此使用 lambda 函数:

import pandas as pd

df = pd.DataFrame({'m1': [pd.Timestamp('2022-10-01'), pd.Timestamp('2022-10-01'), pd.Timestamp('2022-10-01')], 
                   'm2': [pd.Timestamp('2022-04-01'), pd.Timestamp('2022-04-01'), pd.Timestamp('2022-04-01')],  
                   'de': [pd.Timestamp('2023-02-01'), pd.Timestamp('2023-02-01'), pd.Timestamp('2022-05-01')],   
                   're': [pd.Timestamp('2023-03-01'), pd.Timestamp('2023-03-01'), pd.Timestamp('2022-06-01')], 
                   'type': ['aa', 'aa', 'bb']})

df["m2"] += pd.DateOffset(months=int(input('Offset: ')))

# Shift the dependent columns m1, de, re when type is 'aa'
df[df.type == 'aa'] = df[df.type == 'aa'].assign(m1 = lambda row: row['m2'] - pd.DateOffset(months=3))
df[df.type == 'aa'] = df[df.type == 'aa'].assign(de = lambda row: row['m2'] + pd.DateOffset(months=1))
df[df.type == 'aa'] = df[df.type == 'aa'].assign(re = lambda row: row['m2'] + pd.DateOffset(months=2))

# Shift only m1 when type is not 'aa'
df[df.type != 'aa'] = df[df.type != 'aa'].assign(m1 = lambda row: row['m2'] - pd.DateOffset(months=3))

print(df)

【讨论】:

  • 好吧,m2 列不应该是 01/01/2023 吗?并希望有剩余的列。会试试谢谢
  • 在示例中我使用了 offset=4。请注意,我的 sn-p 是一个存根。由于我没有您的原始数据集,因此我重新创建了一个新数据集,包括 m1、m2 和 type only。不用担心,如果你有额外的列,lambda 函数不会影响它们!
  • 我明白了 - 会尝试的。不确定上述解决方案是否考虑了字典 d 和 e 中的其他变化?
  • 不,但为了简单起见,这是故意的。要移动其他列,只需复制/粘贴同一行,但将 assing() 中的所有“m2”替换为“de”和“re”、“m1”或您喜欢的任何内容
  • 谢谢。更清楚了。我编辑了答案。现在它返回你在 offset=9 时提供的输出
【解决方案2】:

您可以使用 MonthOffset 将用户输入的月份添加到所需列中

df = pd.DataFrame({'m1': [pd.Timestamp('2022-10-01'), pd.Timestamp('2022-10-01'), pd.Timestamp('2022-10-01')], 
                   'm2': [pd.Timestamp('2022-04-01'), pd.Timestamp('2022-04-01'), pd.Timestamp('2022-04-01')], 
                   'type': ['aa', 'aa', 'bb']})    

user_input = 9
df['m2'] = df['m2'] + pd.offsets.MonthOffset(user_input)

你得到

    m1          m2          type
0   2022-10-01  2023-01-01  aa
1   2022-10-01  2023-01-01  aa
2   2022-10-01  2023-01-01  bb

【讨论】:

  • 谢谢,但是需要对剩余的列应用移位。
猜你喜欢
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-05
相关资源
最近更新 更多