【问题标题】:Update json file in a dataframe column更新数据框列中的 json 文件
【发布时间】:2022-10-16 15:48:57
【问题描述】:

我有一个数据框

  index  json_col 
   1      json_1
   2      json_2
   ...

其中每个 json_1、jason_2 等都是 json 文件。例如, json_1 是

[
    {
        "origin": "a",
        "destination": "b",
        "leg": "a->b",
        "flights": [
            {
                "aircraftType": "763",
                "departureTimeZulu": "2022-10-08 18:10:00",
                "arrivalTimeZulu": "2022-10-08 22:30:00"
            }
        ]
    },
    {
        "origin": "b",
        "destination": "c",
        "leg": "b->c",
        "flights": [
            {
                "aircraftType": "73H",
                "departureTimeZulu": "2022-10-08 14:51:00",
                "arrivalTimeZulu": "2022-10-08 18:07:00"
            }
        ]
    },
    {
        "origin": "c",
        "destination": "d",
        "leg": "c-d",
        "flights": [
            {
                "aircraftType": "763",
                "departureTimeZulu": "2022-10-08 01:30:00",
                "arrivalTimeZulu": "2022-10-08 05:24:00"
            }
        ]
    }
]

我想为我的 json_col 中的每个 json 文件应用这个逻辑。

  1. 如果第一站的到达时间祖鲁>第二站的出发时间祖鲁,那么我想将第二站的到达和离开时间增加一定天数(比如x天),直到第一站到达时间祖鲁<第二站出发时间祖鲁。

  2. 如果第二站的到达时间祖鲁>第三站的出发时间祖鲁,那么我想将第三站的到达和离开时间增加一定的天数(比如x天),直到第二站的到达时间祖鲁<第三站的出发时间祖鲁。第二站的arrivalTimeZulu 可能在上一步中更新。

    期望的输出:

    [
        {
            "origin": "a",
            "destination": "b",
            "leg": "a->b",
            "flights": [
                {
                    "aircraftType": "763",
                    "departureTimeZulu": "2022-10-08 18:10:00",
                    "arrivalTimeZulu": "2022-10-08 22:30:00"
                }
            ]
        },
        {
            "origin": "b",
            "destination": "c",
            "leg": "b->c",
            "flights": [
                {
                    "aircraftType": "73H",
                    "departureTimeZulu": "2022-10-09 14:51:00",
                    "arrivalTimeZulu": "2022-10-09 18:07:00"
                }
            ]
        },
        {
            "origin": "c",
            "destination": "d",
            "leg": "c-d",
            "flights": [
                {
                    "aircraftType": "763",
                    "departureTimeZulu": "2022-10-10 01:30:00",
                    "arrivalTimeZulu": "2022-10-10 05:24:00"
                }
            ]
        }
    ]
    

    "arrivalTimeZulu":"2022-10-08 22:30:00" > "departureTimeZulu":"2022-10-08 14:51:00" 因此,我们在第二站的departureTimeZulu/arrivalTimeZulu 上增加了一天。

    "arrivalTimeZulu":"2022-10-09 18:07:00" > "departureTimeZulu":"2022-10-08 14:51:00" 因此,我们在第三站的departureTimeZulu/arrivalTimeZulu 上增加了两天。

【问题讨论】:

    标签: python json pandas dictionary


    【解决方案1】:

    使用以下玩具数据框:

    import pandas as pd
    
    df = pd.DataFrame(
        {
            "index": [1, 2],
            "json_col": [
                [
                    {
                        "origin": "a",
                        "destination": "b",
                        "leg": "a->b",
                        "flights": [
                            {
                                "aircraftType": "763",
                                "departureTimeZulu": "2022-10-08 18:10:00",
                                "arrivalTimeZulu": "2022-10-08 22:30:00",
                            }
                        ],
                    },
                    {
                        "origin": "b",
                        "destination": "c",
                        "leg": "b->c",
                        "flights": [
                            {
                                "aircraftType": "73H",
                                "departureTimeZulu": "2022-10-08 14:51:00",
                                "arrivalTimeZulu": "2022-10-08 18:07:00",
                            }
                        ],
                    },
                    {
                        "origin": "c",
                        "destination": "d",
                        "leg": "c-d",
                        "flights": [
                            {
                                "aircraftType": "763",
                                "departureTimeZulu": "2022-10-08 01:30:00",
                                "arrivalTimeZulu": "2022-10-08 05:24:00",
                            }
                        ],
                    },
                ],
                [
                    {
                        "origin": "a",
                        "destination": "b",
                        "leg": "a->b",
                        "flights": [
                            {
                                "aircraftType": "763",
                                "departureTimeZulu": "2022-11-09 18:10:00",
                                "arrivalTimeZulu": "2022-11-09 21:30:00",
                            }
                        ],
                    },
                    {
                        "origin": "b",
                        "destination": "c",
                        "leg": "b->c",
                        "flights": [
                            {
                                "aircraftType": "73H",
                                "departureTimeZulu": "2022-11-09 14:51:00",
                                "arrivalTimeZulu": "2022-11-09 19:07:00",
                            }
                        ],
                    },
                    {
                        "origin": "c",
                        "destination": "d",
                        "leg": "c-d",
                        "flights": [
                            {
                                "aircraftType": "763",
                                "departureTimeZulu": "2022-11-09 01:30:00",
                                "arrivalTimeZulu": "2022-11-09 03:24:00",
                            }
                        ],
                    },
                ],
            ],
        }
    )
    

    这是使用 Pandas concat、cumsum 和 DateOffset 的一种方法:

    for idx in df.index:
        # Make a dataframe properly formatted from each json file
        temp = pd.concat(
            [
                pd.DataFrame(df.loc[idx, "json_col"][i]["flights"])
                for i in range(len(df.loc[idx, "json_col"]))
            ],
            ignore_index=True,
        ).astype(
            {"departureTimeZulu": "datetime64[ns]", "arrivalTimeZulu": "datetime64[ns]"}
        )
    
        # Evaluate number of days to add to each arrival and departure dates
        temp["delta"] = (
            (temp["departureTimeZulu"] < temp["arrivalTimeZulu"].shift(1))
            .astype(int)
            .cumsum()
        )
    
        # Increment arrival and departure dates
        for col in ["departureTimeZulu", "arrivalTimeZulu"]:
            temp[col] = temp.apply(
                lambda x: x[col] + pd.DateOffset(days=x["delta"]), axis=1
            ).astype(str)
    
        # Cleanup and get data back in json file
        temp = temp.drop(columns="delta")
        new_values = temp.to_dict(orient="records")
        for i, new_value in enumerate(new_values):
            df.loc[idx, "json_col"][i]["flights"] = new_value
    

    然后,您可以检查每个 json 对象是否已正确修改:

    print(df.loc[0, "json_col"])
    # Output
    [
        {
            "origin": "a",
            "destination": "b",
            "leg": "a->b",
            "flights": {
                "aircraftType": "763",
                "departureTimeZulu": "2022-10-08 18:10:00",
                "arrivalTimeZulu": "2022-10-08 22:30:00",
            },
        },
        {
            "origin": "b",
            "destination": "c",
            "leg": "b->c",
            "flights": {
                "aircraftType": "73H",
                "departureTimeZulu": "2022-10-09 14:51:00",
                "arrivalTimeZulu": "2022-10-09 18:07:00",
            },
        },
        {
            "origin": "c",
            "destination": "d",
            "leg": "c-d",
            "flights": {
                "aircraftType": "763",
                "departureTimeZulu": "2022-10-10 01:30:00",
                "arrivalTimeZulu": "2022-10-10 05:24:00",
            },
        },
    ]
    
    print(df.loc[1, "json_col"])
    # Output
    [
        {
            "origin": "a",
            "destination": "b",
            "leg": "a->b",
            "flights": {
                "aircraftType": "763",
                "departureTimeZulu": "2022-11-09 18:10:00",
                "arrivalTimeZulu": "2022-11-09 21:30:00",
            },
        },
        {
            "origin": "b",
            "destination": "c",
            "leg": "b->c",
            "flights": {
                "aircraftType": "73H",
                "departureTimeZulu": "2022-11-10 14:51:00",
                "arrivalTimeZulu": "2022-11-10 19:07:00",
            },
        },
        {
            "origin": "c",
            "destination": "d",
            "leg": "c-d",
            "flights": {
                "aircraftType": "763",
                "departureTimeZulu": "2022-11-11 01:30:00",
                "arrivalTimeZulu": "2022-11-11 03:24:00",
            },
        },
    ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-15
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 2020-10-26
      • 1970-01-01
      • 2019-05-11
      • 2022-10-14
      相关资源
      最近更新 更多