在 Python 中将 Dekad 转换为开始和结束日期

Convert Dekad to start and end date in Python

提问人:user308827 提问时间:11/15/2023 更新时间:11/15/2023 访问量:33

问:

我有一个 pandas 数据帧,其中包含一个包含 Dekad(10 天)信息的列,例如 Dekad 1 是 1 月 1 日至 1 月 10 日,Dekad 2 是 1 月 11 日至 1 月 20 日,依此类推。

有没有办法在给定 dekad 号码的情况下获取开始和结束日期信息?我可以通过硬编码来做到这一点,但更像 python 的解决方案会更好。

数据帧看起来像这样,我想添加一个名为 date_range_dekad 的新列,其中包含连接成一个字符串的开始和结束日期

                  CEI  Dekad
0         160.004352     1
1           0.000000     2
2           0.000000     3
3           0.000000     4
4           0.000000     5
Python 熊猫 日期时间

评论


答:

1赞 Timeless 11/15/2023 #1

使用interval_range的一个可能选项:

dekad = 10

rng = pd.interval_range(
    pd.Timestamp("20230101"), pd.Timestamp("20231231"), freq=f"{dekad-1}D")
    
df["date_range_dekad"] = [
    "{:%d-%b} to>> {:%d-%b}".format(
        *(rng[dk].left, rng[dk].right) if dk == 0 # to be adjusted ?
        else (rng[dk].left  + pd.Timedelta(days=dk),
              rng[dk].right + pd.Timedelta(days=dk)))
    for dk in df["Dekad"].sub(1)
]

或者,通过切片date_range

rng = pd.date_range("20230101", "20231231", freq="1D")

df["date_range_dekad"] = [
    "{:%d-%b} to>> {:%d-%b}".format(
        rng[dekad*dk:dekad*(dk+1)].min(),
        rng[dekad*dk:dekad*(dk+1)].max())
    for dk in df["Dekad"].sub(1)   
]

输出:

print(df)

          CEI  Dekad    date_range_dekad
0  160.004352      1  01-Jan to>> 10-Jan
1    0.000000      2  11-Jan to>> 20-Jan
2    0.000000      3  21-Jan to>> 30-Jan
3    0.000000      4  31-Jan to>> 09-Feb
4    0.000000      5  10-Feb to>> 19-Feb