数据框中的日期字段在导出后删除前导 0

Posted

技术标签:

【中文标题】数据框中的日期字段在导出后删除前导 0【英文标题】:Date field from dataframe removes leading 0 after export 【发布时间】: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 进行验证,但现在我在文本编辑器中检查了前导零!所以问题与代码无关,而是我打开它的方式.... -_- 【参考方案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 正确读取。

【讨论】:

以上是关于数据框中的日期字段在导出后删除前导 0的主要内容,如果未能解决你的问题,请参考以下文章

将 csv 文件中的日期字段读取到数据框中

如何在R中的数据框中转换日期/时间列

按日期范围删除数据框中的行。

从熊猫数据框中的日期时间中删除时间戳

将 int 存储到 SQL,但保持前导零

如何删除 MySQL 字段中的前导和尾随空格?