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

时间:2019-05-31 01:01:42

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

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

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,但将其导出到csv时,在导出的文件上仍会删除前导零,如下所示。

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

字段,如csv:

Dt_DDMMAAAA
30102019
12052019
7052019
26042019
3052019
22042019
25042019
2062019

我知道我一定会在这里遗漏一点,但我只是无法弄清楚问题出在哪里(或者甚至是一个问题,而不是一个错误使用的方法)。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

我将使用var jsonString = "{ \"enumKey\" : \"none\" }"; +'to_excel`,因为在csv中,如果使用text打开,它将显示前导零,因为在显示时csv不会保留任何格式,您可以使用excel

strftime

答案 2 :(得分:1)

首先,您的方法正在生成一个文件,该文件包含预期的前导零。我从您的描述中重建了这个最小的工作示例,它工作得很好:

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

现在就为什么您认为它不起作用了。如果您主要在熊猫中,则可以通过在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正确读取。