To Create a pivot table by 6 month interval first Try to add the vessel column:
date_rng = pd.date_range(start="2023-01-01", end="2024-01-05", freq="D") data = np.random.rand(len(date_rng), 3) df = pd.DataFrame(data, columns=["Column1", "Column2", "Column3"], index=date_rng) # added Vessel column df["Vessel"] = np.random.randint(1, 5, size=len(date_rng)) pivot_df = pd.pivot_table( df, index=[df.index.year, np.where(df.index.month <= 6, "H1", "H2")], columns="Vessel", values=["Column1", "Column2", "Column3"], aggfunc="nunique", ) print(pivot_df) |
Prints:
Column1 Column2 Column3 Vessel 1 2 3 4 1 2 3 4 1 2 3 4 2023 H1 39.0 41.0 59.0 42.0 39.0 41.0 59.0 42.0 39.0 41.0 59.0 42.0 H2 43.0 53.0 34.0 54.0 43.0 53.0 34.0 54.0 43.0 53.0 34.0 54.0 2024 H1 NaN 1.0 3.0 1.0 NaN 1.0 3.0 1.0 NaN 1.0 3.0 1.0 |
EDIT: To convert index back to dates:
pivot_df.index = [ pd.to_datetime(f'{year}-{"01-01" if half == "H1" else "06-01"}') for year, half in pivot_df.index ] print(pivot_df) |
Prints:
Column1 Column2 Column3 Vessel 1 2 3 4 1 2 3 4 1 2 3 4 2023-01-01 48.0 44.0 43.0 46.0 48.0 44.0 43.0 46.0 48.0 44.0 43.0 46.0 2023-06-01 49.0 41.0 48.0 46.0 49.0 41.0 48.0 46.0 49.0 41.0 48.0 46.0 2024-01-01 1.0 1.0 NaN 3.0 1.0 1.0 NaN 3.0 1.0 1.0 NaN 3.0 |
Answered by: >Andrej Kesely
Credit:> StackOverflow
Suggested blogs:
>How to do wild grouping of friends in Python?
>How to download an entire S3 bucket - Complete Guide
>How to get item details of Woo Commerce in custom email content?
>How to install Laravel using composer and configure?
>How to merge cells with HTML, CSS, and PHP?
>How to Migrate your apps to Android 13
>How to Read a csv file with php using cURL
>How to read frame from ffmpeg subprocess in Python?