【问题标题】:Date field from dataframe removes leading 0 after export数据框中的日期字段在导出后删除前导 0
【发布时间】:2019-10-16 15:38:51
【问题描述】:

我有一个包含以下日期字段的数据框:

463    14-05-2019
535    03-05-2019
570    11-05-2019
577    09-05-2019
628    08-08-2019
630    25-05-2019
Name: Date, dtype: object

我必须将其格式化为 DDMMAAAA。这就是我在循环中所做的事情 (for idx, row in df.iterrows():):

  • 我正在使用正则表达式删除 \- 字符:

    df.at[idx, 'Date'] = re.sub('\-', '', df.at[idx, 'Date'])

  • 然后使用 apply 来强制执行和一个带前导零的 8 位字符串

    df['Date'] = df['Date'].apply(lambda x: '{0:0>8}'.format(x))

但即使 df['Date'] 字段有 8 位数字,df 上的前导 0 为 0,当将其导出到 csv 时,导出文件中的前导零也会被删除,如下所示。

df.to_csv(path_or_buf=report, header=True, index=False, sep=';')

csv 中的字段:

Dt_DDMMAAAA
30102019
12052019
7052019
26042019
3052019
22042019
25042019
2062019

我知道我一定是在此过程中遗漏了要点,但我就是不知道是什么问题(或者如果它甚至是一个问题,而不是一个误用的方法)。

【问题讨论】:

  • 我认为了解您的方法在文件中产生正确的输出非常重要,但您可能会错误地读取文件。如果您添加有关如何检查/阅读 CSV 的更多详细信息,这将对这个答案有很大帮助。
  • 我通过外部集成将其导出到 csv 以将其发送到另一个系统(我无权访问它)。并且要求我将其作为 csv 发送。
  • 感谢您指出这一点,我正在通过在 wps 中打开 csv 进行验证,但现在我在文本编辑器中检查了前导零!所以问题与代码无关,而是我打开它的方式.... -_-

标签: python regex pandas dataframe export-to-csv


【解决方案1】:

IMO 最简单的方法是在写入 CSV 时使用 date_format 参数。这意味着您需要事先使用pd.to_datetime 将“日期”列转换为datetime

(df.assign(Date=pd.to_datetime(df['Date'], errors='coerce'))
   .to_csv(path_or_buf=report, date_format='%d%m%Y', index=False))

打印出来,

Date
14052019
05032019
05112019
05092019
08082019
25052019

有关to_csv 参数的更多信息可以在Writing a pandas DataFrame to CSV file 中找到。

【讨论】:

    【解决方案2】:

    我要做的是使用strftime + 'to_excel`,因为在 csv 中,如果你用 text 打开它,它将显示前导零,因为 csv 在显示时不会保留任何格式,在这种情况下,你可以用excel

    pd.to_datetime(df.Date,dayfirst=True).dt.strftime('%m%d%Y').to_excel('your.xls')
    Out[722]: 
    463    05142019
    535    05032019
    570    05112019
    577    05092019
    628    08082019
    630    05252019
    Name: Date, dtype: object
    

    【讨论】:

      【解决方案3】:

      首先,您的方法正在生成一个包含前导零的文件,正如您所期望的那样。我根据您的描述重建了这个最小的工作示例,它工作得很好:

      import pandas
      import re
      
      df = pandas.DataFrame([["14-05-2019"],
                             ["03-05-2019"],
                             ["11-05-2019"],
                             ["09-05-2019"],
                             ["08-08-2019"],
                             ["25-05-2019"]], columns=['Date'])
      
      for idx in df.index:
          df.at[idx, 'Date'] = re.sub('\-', '', df.at[idx, 'Date'])
      df['Date'] = df['Date'].apply(lambda x: '{0:0>8}'.format(x))
      
      df.to_csv(path_or_buf="report.csv", header=True, index=False, sep=';')
      

      此时report.csv 包含此内容(如您所愿使用前导零)。

      Date
      14052019
      03052019
      11052019
      09052019
      08082019
      25052019
      

      现在说说你为什么认为它不起作用。如果你主要在 Pandas 中,你可以通过在 read_csv 中指定一个 dtype 来阻止它猜测输出的类型:

      df_readback = pandas.read_csv('report.csv', dtype={'Date': str})
      
      
             Date
      0  14052019
      1  03052019
      2  11052019
      3  09052019
      4  08082019
      5  25052019
      

      也可能是您正在 Excel 中阅读此内容(我从您使用 ; 分隔符的事实中猜测这一点)。遗憾的是,无法确保 Excel 在双击时正确读取此字段,但如果这是您的最终目标,您可以在 this answer 中查看如何修改文件以使 Excel 正确读取。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-14
        • 1970-01-01
        相关资源
        最近更新 更多