我有一个带有以下日期字段的数据框:
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'])
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
我知道我一定会在这里遗漏一点,但我只是无法弄清楚问题出在哪里(或者甚至是一个问题,而不是一个错误使用的方法)。
答案 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正确读取。