【问题标题】:Pandas not recognising older dates (pre-1600)熊猫无法识别较早的日期(1600 年前)
【发布时间】:2021-04-10 14:41:30
【问题描述】:

我正在以 csv 格式输入数据。大多数日期都在 1900 年之后,但也有一些比这更早。迄今为止我见过的最古老的是 1518 年。

1518 日期实际上出现了越界错误。我知道 python 应该能够处理 584 岁左右的日期,但在这种情况下它没有。这个限制不是问题。

这是我的数据示例:

Index,Dates
00457,01/01/1981
134535,22/12/1977
3015,15/11/1889
00458,01/01/1981
00459,01/01/1981
134774,10/01/1978
00461,01/01/1981
00764,01/01/2000
00462,01/01/1981
00899,23/09/1518
00063,01/01/1981
00464,01/01/1981

使用中读取文件后:

DF = pd.read_csv(sourceFile5,parse_dates=['Dates'], dayfirst=True, index_col="cNumber", skipinitialspace = True)

格式很好,但是当我尝试使用过滤结果时

newDF.append(DF[ DF["Dates"] > one_month_ago])

(请注意 one_month_ago 是我的脚本定义的变量)

没有任何条目被识别(即使是从 1900 年开始的条目)。我知道 filter 命令有效,因为我已将这些与不包含此类旧日期的其他 .csv 文件一起使用并且没有问题。

为此,我添加了额外的步骤:

DF["Dates"] = pd.to_datetime(DF["Dates"], dayfirst = True, format = "%d/%m/%Y", errors = "coerce")

1900 年后的日期返回正常,但更早的日期返回为 YYYY-MM-DD。即便如此,在我上面提到的过滤阶段,即使在这个额外的步骤之后,也没有被识别出来。该列似乎以一系列字符串的形式返回。

我不知道为什么会这样。有人可以帮忙吗?

【问题讨论】:

  • 这些越界日期是否有效?我建议使用关键字 dayfirst=Trueerrors='coerce' 尝试 pd.to_datetime

标签: python python-3.x pandas datetime


【解决方案1】:

根据documentation, there's limitation可以使用 64 位整数表示的时间跨度限制为大约 584 年)。

你可以represent Out-of-Bounds Spans使用Periods进行计算:

def conv(x):
    day, month, year = map(int, x.split("/"))
    return pd.Period(year=year, month=month, day=day, freq="D")


df = pd.read_csv("your_file.csv")
df["Dates"] = df["Dates"].apply(conv)
print(df["Dates"])

打印:

0     1981-01-01
1     1977-12-22
2     1889-11-15
3     1981-01-01
4     1981-01-01
5     1978-01-10
6     1981-01-01
7     2000-01-01
8     1981-01-01
9     1518-09-23
10    1981-01-01
11    1981-01-01
Name: Dates, dtype: period[D]

编辑:删除1518-09-23后,就可以正常加载文件了:

df = pd.read_csv("your_file.csv")
df["Dates"] = pd.to_datetime(df["Dates"])
print(df["Dates"])

打印:

0    1981-01-01
1    1977-12-22
2    1889-11-15
3    1981-01-01
4    1981-01-01
5    1978-10-01
6    1981-01-01
7    2000-01-01
8    1981-01-01
9    1981-01-01
10   1981-01-01
Name: Dates, dtype: datetime64[ns]

注意datetime64[ns]

【讨论】:

  • 谢谢。我在我的问题中提到了这个限制,但这并没有引起问题。即使删除了 14 世纪的日期,19 世纪的日期也显​​示出同样的问题。
  • @jfc4eva 您不能将23/09/1518 表示为pd.Timestamp,但您可以将其表示为pd.Period
  • 非常感谢。您现在能解释一下为什么即使删除了 14 世纪的日期我也会遇到同样的问题吗?一般来说,这似乎是 20 世纪之前的日期的更多问题
  • 我会在原始数据集上尝试一些东西并回复您。谢谢
  • 抱歉,事实证明发生了两件事。你对第一个是正确的,你不会知道第二个。我通过注释掉部分脚本来绕过问题文件。当我像在这里一样回来解决它们时,日期时间而不是期间存在问题,但我也没有在适当的位置附加 newDF。我没有意识到我把它遗漏了,我在这里发布的代码也不会显示,所以我接受了你的回答。
猜你喜欢
  • 2021-05-09
  • 2023-03-26
  • 2019-09-03
  • 1970-01-01
  • 2021-08-14
  • 2018-12-12
  • 1970-01-01
  • 2019-05-20
  • 1970-01-01
相关资源
最近更新 更多