我有一个主数据框,我正在尝试使用 df.loc 将这些切片分成多个较小的数据框,并将这些切片基于日期时间列,如下所示:
jan_2021 = merged_df.loc[(merged_df['Value_Date'] > '2021-1-1') & (merged_df['Value_Date'] <= '2021-1-31')]
feb_2021 = merged_df.loc[(merged_df['Value_Date'] > '2021-2-1') & (merged_df['Value_Date'] <= '2021-2-28')]
mar_2021 = merged_df.loc[(merged_df['Value_Date'] > '2021-3-1') & (merged_df['Value_Date'] <= '2021-3-31')]
apr_2021 = merged_df.loc[(merged_df['Value_Date'] > '2021-4-1') & (merged_df['Value_Date'] <= '2021-3-31')]
我需要继续这样做直到 2023 年 2 月。是否有更快的方法在某种循环中迭代日期时间列,而不必为每个切片写出每个日期时间范围?
其次,我还想将每个切片数据帧写入CSV文件。
jan_2021.to_csv(output_filepath_csv+'Jan21.csv',index=False)
feb_2021.to_csv(output_filepath_csv+'Feb21.csv',index=False)
再一次,有没有办法循环遍历数据帧?我猜想把它们放在一个列表中并循环遍历列表?
具有以下玩具数据框:
import pandas as pd
df = pd.DataFrame(
{
"date": [
"2021-1-1",
"2021-1-2",
"2021-2-3",
"2021-2-7",
"2021-3-11",
"2021-4-19",
"2021-4-22",
],
"col1": [1, 3, 9, 4, 2, 8, 7],
"col2": [4, 3, 7, 5, 4, 9, 1],
}
)
这是使用 Pandas to_datetime 和 Python 标准库的 strptime 和 strftime 的一种方法:
import datetime
# Add new columns "year" and "month"
df["date"] = pd.to_datetime(df["date"], format="%Y-%m-%d")
df["year"] = df["date"].apply(lambda x: x.year)
df["month"] = df["date"].apply(lambda x: x.month)
# Use a dict comprehension to slice dataframe
# keys: Jan21, Feb21, Mar21, Apr21
# Access slices like: dfs["Mar21"], for instance
dfs = {
datetime.datetime.strptime(f"{year_and_month[0]}-{year_and_month[1]}", "%Y-%m")
.strftime("%b%y"): sub_df.drop(columns=["year", "month"])
.reset_index(drop=True)
for year_and_month, sub_df in df.groupby(["year", "month"])
}
# Save to disk
for month, sub_df in dfs.items():
sub_df.to_csv("path_to_dir" + f"/{month}.csv", index=False)
# In path_dir: Jan21.csv, Feb21.csv, Mar21.csv, Apr21.csv