【问题标题】:Python Pandas create 5 excel files from 1 table based on datePython Pandas 根据日期从 1 个表中创建 5 个 excel 文件
【发布时间】:2019-08-11 12:37:52
【问题描述】:

日期存储为日期时间。我不想硬编码日期。我希望脚本查找具有相同日期的列,将它们组合在一起并导出到文件名中包含日期的文件。

    Account  |  datestart   |   Charge  |
   ----------+--------------+-----------+
    123A     |  2019-03-14  |   7299    |
    5866A    |  2019-03-14  |   4000    | 
    12321A   |  2019-03-14  |   5000    |
    312332A  |  2019-03-13  |   5000    |
    586A     |  2019-03-13  |   4000    |
    967567A  |  2019-03-13  |   5167.66 |
    3437A    |  2019-03-12  |   9187.2  |
    956734A  |  2019-03-12  |   4482    |
    36736A   |  2019-03-11  |   4101    |
    3567356A |  2019-03-10  |   4007.85 |
    9467A    |  2019-03-10  |   5097.18 |

脚本应导出为 5 个文件。每个文件将仅包含具有特定日期的数据。

例如,第一个文件应该是这样的

    Account  |  datestart   |   Charge  |
   ----------+--------------+-----------+
    123A     |  2019-03-14  |   7299    |
    5866A    |  2019-03-14  |   4000    | 
    12321A   |  2019-03-14  |   5000    |

第二个文件应该是这样的

    Account  |  datestart   |   Charge  |
   ----------+--------------+-----------+
    312332A  |  2019-03-13  |   5000    |
    586A     |  2019-03-13  |   4000    |
    967567A  |  2019-03-13  |   5167.66 |

第一个文件应保存为 file_031419,第二个文件应保存为 file_031319。我将要查看的数据将具有一个日期变量,因此文件名应该根据文件中的日期是动态的。

这是我尝试的一些代码

filedates = list(none['datestart'].unique())

for date in filedates: 
   filename = 'File_'+list(set(pd.to_datetime(none.loc[idx, 'datestart']).dt.strftime('%m%d%y')))[0]+'.xlsx'
   none.loc[idx, 'datestart'].to_excel(filename) 

【问题讨论】:

  • 请贴出你试过的代码
  • 使用我刚刚添加的代码,我只得到一个包含所有数据的文件。
  • 1) 你的“for”语句下的代码真的没有缩进吗?
  • 2) idx = none.datestart == date 应该完成什么?

标签: python pandas loops date export-to-excel


【解决方案1】:

您可以尝试以下方法:

for i , g in df.groupby('datestart'):
    g.to_csv('C:\\path\\'+'file_'+ \
         g.datestart.dt.strftime('%y%m%d').astype(str).iloc[0] +'.csv',index=False)

【讨论】:

    【解决方案2】:

    这与 anky_91 并没有太大区别,但文件名与 OP 要求的相同,并且可能更容易理解,因为一旦使用小函数 save_group 它就非常灵活

    首先我们复制您的相同数据集

    import pandas as pd
    
    
    txt = """123A     |  2019-03-14  |   7299    |
        5866A    |  2019-03-14  |   4000    | 
        12321A   |  2019-03-14  |   5000    |
        312332A  |  2019-03-13  |   5000    |
        586A     |  2019-03-13  |   4000    |
        967567A  |  2019-03-13  |   5167.66 |
        3437A    |  2019-03-12  |   9187.2  |
        956734A  |  2019-03-12  |   4482    |
        36736A   |  2019-03-11  |   4101    |
        3567356A |  2019-03-10  |   4007.85 |
        9467A    |  2019-03-10  |   5097.18 |"""
    
    txt = txt.split("\n")
    txt = [t.split("|")[:-1] for t in txt]
    
    df = pd.DataFrame(txt, columns=["Account", "datestart", "Charge"] )
    for col in df.columns:
        df[col] = df[col].str.rstrip().str.lstrip()
    
    df["datestart"] = df["datestart"].astype("M8[us]")  
    

    然后对于要保存为 csv 文件的每个组

    def save_group(grp):
        fn = grp["datestart"].dt.strftime('%m%d%y').astype(str).iloc[0]
        fn = "".join(["file_",fn, ".csv"])
        grp.to_csv(fn, index=False)
    

    要将它用于每个组,您只需使用apply

    df.groupby("datestart").apply(lambda x: save_group(x))
    

    【讨论】:

      猜你喜欢
      • 2019-08-10
      • 1970-01-01
      • 2022-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-21
      • 2019-07-25
      • 2017-03-09
      相关资源
      最近更新 更多