【问题标题】:Python automatically converting specific data to date format and losing dataPython自动将特定数据转换为日期格式并丢失数据
【发布时间】:2021-03-06 01:48:24
【问题描述】:

我正在用 pandas 清理一个 csv 文件,主要是删除特殊字符,例如('/'、'#' 等)。该文件有 7 列(都不是日期)。

在某些列中,只有数字数据,例如“1980 年 11 月 6 日”。

我注意到直接在读取 csv 文件后,

df = pd.read_csv ('report16.csv', encoding ='ANSI')

此数据变为“11/6/80”,清理后变为“11 6 80”(与输出文件中的结果相同)。因此,无论数据有“/”,它都被解释为日期,python 正在从数据中删除前 2 位数字。

Data Expected result Actual Result
11/6/1980 11 6 1980 11 6 80
12/8/1983 12 8 1983 12 8 83

以上两个结果都是错误的,因为在实际结果列中,我在最后丢失了 2 位数字。

数据是这样的

Org Name Code Code copy
ABC 11/6/1980 11/6/1980
DEF 12/8/1983 12/8/1983
GH 11/5/1987 11/5/1987
OrgName,    Code,   Code copy
ABC,    11/6/1980,  11/6/1980
DEF,    12/8/1983,  12/8/1983
GH, 11/5/1987,  11/5/1987
KC,      9000494,          9000494

值得一提的是,该列包含其他数据,例如“900490”、字符串等,但在这些情况下,没有任何问题。

怎样才能不允许这种转换?

【问题讨论】:

  • 欢迎来到 SO!只要您以我们习惯的方式提问,您就会在这里找到帮助。在这里,如果您向我们展示您使用的代码以及显示问题的数据 - 事实上,如果您提供minimal reproducible example,您可以获得更相关和更详细的答案。如果您不太了解minimal reproducible example 是什么,请阅读How to Ask...
  • 我无法复制。请参阅下面我的(非)答案以获取更多详细信息。
  • 这里仍然不是可用的格式。由于问题是在读取 csv 文件时,您应该以原始文本格式而不是电子表格格式显示文件,例如在 Windows 控制台 CMD 窗口中使用 type file.csv 或在 Unix 上使用 cat file.csv 时喜欢。或者当你在一个简单的文本编辑器中打开它,比如 Windows 记事本,或类 Unix 上的 vi,或 notepad++

标签: python pandas dataframe date data-cleaning


【解决方案1】:

不是答案,但 cmets 不允许包含良好呈现的代码和数据。

这是我所说的最小可重现示例:

sample.csv 文件内容:

Data,Expected result,Actual Result
11/6/1980,11 6 1980,11 6 80
12/8/1983,12 8 1983,12 8 83

代码:

df = pd.read_csv('sample.csv')
print(df)
s = df['Data'].str.replace('/', ' ')
print((df['Expected result'] == s).all())

它给出了:

        Data Expected result Actual Result
0  11/6/1980       11 6 1980       11 6 80
1  12/8/1983       12 8 1983       12 8 83
True

这证明read_csv已经正确读取了文件并且没有改变任何东西。

请以文本形式显示您的 CSV 文件的内容,以及足够的代码来重现您的问题。

【讨论】:

  • 这不是一个答案,可能会在一段时间内被删除......无论如何应该是;-)
  • 这看起来像是对我的回答。一个很好的答案。向 OP 展示了解决问题的一个非常好的第一步:将问题分解为可以证明/反驳的部分(“证明 read_csv 已正确读取文件”)。还展示了 OP 如何通过提供问题的核心来获得更好的支持:文本文件。干得好。
  • @jim 感谢您的支持 :-) 。我说这不是一个完全出于这些原因的答案:它解释了 OP 如何提出问题,它解释了他们在问这里之前应该在自己的系统上控制什么,或者至少在他们需要解释时应该显示什么。通常应该进入 cmets 的所有东西 :-(
【解决方案2】:

试试字符串操作怎么样?!首先选择您要修改的列并将“/”或“#”替换为空格:column.str.replace("/", "")。我希望这会奏效!

【讨论】:

  • 我试过这个,但是在阅读 csv 文件时问题变得很明显。因此,在读取文件后,它们立即变为日期,并且“年份”列的 2 位数字丢失。到目前为止,我所做的是在 excel 中将 '/' 替换为 ' * ' 并重新读取文件,这样就可以了。但是我想知道在 Python 中是否有解决方法。
【解决方案3】:

转换日期的行为并不是严格意义上的 Python 问题。您正在使用 pandas read_csv。

尝试显式声明分隔符。如果 sep 没有声明,它会进行猜测。

df = pd.read_csv ('report16.csv', encoding ='ANSI', sep =',') 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    相关资源
    最近更新 更多