数据框中的日期字段在导出后删除前导 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():
):
\-
字符:
然后使用 apply 来强制执行和一个带前导零的 8 位字符串
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 为 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的主要内容,如果未能解决你的问题,请参考以下文章