【问题标题】:Calculating YTD change with dates as column headers使用日期作为列标题计算 YTD 变化
【发布时间】:2022-11-16 00:25:13
【问题描述】:

我的桌子看起来像这样:

Sector 1/1/2022 5/1/2022 6/1/2022 1Y Min
X 10 05 12 05
Y 18 20 09 09
Z 02 09 12 02

我想添加一个新列“YTD 更改”,以便使用以下公式计算新列的值:(截至最新日期的值 - 截至今年第一个可用日期的值)

我想让公式保持动态,以便在有新日期的列可用时更新它,因为列的位置可能会随着新数据而变化。

例如:-

Sector 1/1/2022 5/1/2022 6/1/2022 1Y Min YTD Chg
X 10 05 12 05 2
Y 18 20 60 09 40
Z 02 09 12 02 10

【问题讨论】:

  • 你试过什么了? FWIW:为什么 Y 列中的 YTD Chg 40?这不应该是42吗?
  • 您应该在发布之前添加您尝试过的内容,否则人们只会做您的工作。

标签: python


【解决方案1】:

这样的事情怎么样:

import pandas as pd
from datetime import datetime 
df = pd.DataFrame({
    "Sector": ["X", "Y", "Z"],
    "1/1/2022": ["10", "18", "02"],
    "5/1/2022": ["05", "20", "09"],
    "6/1/2022": ["12", "60", "12"],
})


def add_YTD_chg(data):
    datetime_formatting = "%d/%m/%Y" # check if this formatting is correct. Might be using MM/DD/YYYY?

    invalid_date_columns = ["Sector", "1Y Min"] # declare here cols which are not date-related

    sorted_datetimes = sorted([ # convert to datetime object and sort
        {"datetime":datetime.strptime(i, datetime_formatting), "col_name":i}
        for i in data.columns if i not in invalid_date_columns
    ], key=lambda x: x["datetime"])

    if len(sorted_datetimes) < 2: return # not enough dates to compare "oldest" to "newest"
    
    oldest = sorted_datetimes[0]
    newest = sorted_datetimes[-1]

    data["YTD_Chg"] = data[newest["col_name"]].astype(int) - data[oldest["col_name"]].astype(int)

add_YTD_chg(df)

print(df)
# >>>   Sector 1/1/2022 5/1/2022 6/1/2022  YTD_Chg
# >>> 0      X       10       05       12        2
# >>> 1      Y       18       20       60       42
# >>> 2      Z       02       09       12       10

我这里的方法是提取所有日期列,将它们转换为 datetime 对象(这里注意,您还需要记住列的名称),然后按日期时间排序。然后您要做的是根据最新列和最旧列的值创建新列。

一些注意事项:

  • 我添加了一个检查以确保至少有两列可以比较。如果没有要比较的两列,则退出该函数。您可能想以不同的方式执行此操作。
  • 我假设您使用的是日期格式DD/MM/YYYY。如果此假设不正确,您可能需要编辑 datetime_formatting 变量以反映这一点。

希望这可以帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 2020-10-20
    • 2021-08-16
    相关资源
    最近更新 更多