python - 如何使用熊猫将日期视为纯文本?
问题描述
我使用 pandas 读取 .csv 文件,然后将其保存为 .xls 文件。代码如下:
import pandas as pd
df = pd.read_csv('filename.csv', encoding='GB18030')
print(df)
df.to_excel('filename.xls')
有一列包含像'2020/7/12'这样的日期,看起来熊猫将其识别为日期并自动将其输出到'2020-07-12'。我不想格式化此列或任何其他类似的列,我想保持所有数据与纯文本相同。
这种转换发生在read_csv()
,因为print(df)
在 之前已经输出了 YYYY-MM-DD to_excel()
。
我尝试使用df.info()
检查该列的数据类型,数据类型是对象。然后我添加了参数dtype=pd.StringDtype()
,read_csv()
它没有帮助。
该文件包含汉字所以我将编码设置为GB18030,不知道这是否重要。
解决方案
我关于pd.read_csv的经验表明:
- 默认情况下,只有可转换为int或float的列才会转换为相应的类型。
- “类似日期”的字符串仍被读取为字符串(生成的DataFrame中的列类型实际上是object)。
如果您希望read_csv将此类列转换为日期时间类型,则应传递parse_dates参数,指定要解析为日期的列列表。由于您没有这样做,因此不应将源列转换为日期时间类型。
要检查此详细信息,请在阅读file后运行file.info()
并检查相关列的类型。
因此,如果相应的Excel文件列是Date类型,那么这种转换可能是由to_excel引起的。
还有一点关于变量名的评论:您使用read_csv阅读的是DataFrame,而不是file。实际文件是您从中读取内容的源对象,但在这里您只传递了文件名。
所以不要使用文件之类的名称来命名生成的 DataFrame,因为这会产生误导。最好使用例如df。
从 05:58Z 开始在评论后编辑
为了全面检查您在评论中写的内容,我创建了以下 CSV 文件:
DateBougth,Id,Value
2020/7/12,1031,500.15
2020/8/18,1032,700.40
2020/10/16,1033,452.17
我跑了:df = pd.read_csv('Input.csv')
然后print(df)
,得到:
DateBougth Id Value
0 2020/7/12 1031 500.15
1 2020/8/18 1032 700.40
2 2020/10/16 1033 452.17
因此,在Pandas级别,DateBugth 列中没有发生格式转换。剩下的两列都包含数字内容,因此它们被默默地转换为int64和float64,但DateBought仍然是object。
然后我将此df保存到一个Excel文件中,运行:df.to_excel('Output.xls')
并用Excel打开它。内容是:
因此,在 Excel 级别上都没有发生任何数据类型转换。
要查看B2单元格的实际数据类型(第一个DateBougth),我单击此单元格并按下Ctrl-1以显示单元格格式。正如我所料,格式是General(不是Date )。
也许你有一些过时的软件版本?我使用Python v. 3.8.2 和Pandas v. 1.0.3。
另一个要检查的细节:在pd.read_csv之后查看您的代码。也许您在某个地方放置了诸如df.DateBought = pd.to_datetime(df.DateBought)(显式类型转换)之类的指令?或者至少格式转换。请注意,在我的环境中, DateBought列的格式绝对没有变化。
推荐阅读
- python - 系统 Python 虚拟环境“找到”Anaconda Python - 如何防止这种情况?
- flutter - showdialog 中的 Navigator.push() 不起作用
- html - 如何在每个图像下按垂直和水平顺序设置图像?
- python - 如何制作这个 LogLog 图?
- javascript - Axios - 更新导出的 axios.create 实例上的标头
- javascript - 如何使用 jQuery 定位按钮以从特定文本区域获取文本?
- python - exec() 中的 Python 函数未添加到 globals/locals dict
- javascript - 相同类型的对象永远不能被认为是“相同的”但相同类型的原语可以被认为是重要的吗?
- c++ - 为什么 ^z 有两个 ASCII 码?
- apache-spark - Pyspark 数据帧写入和读取更改架构