【问题标题】:Wrong Dates in Pandas熊猫日期错误
【发布时间】:2020-01-02 20:27:40
【问题描述】:

我正在尝试读取具有日期列的 csv 文件。日期存储为 8/27/1962、9/12/1959 和 7/15/1965。当我使用 to_datetime 函数时,日期被转换为 2062 年 8 月 27 日、2059 年 9 月 12 日和 2065 年 7 月 15 日。我不确定为什么会这样。是因为年份变了还是什么?

例子:

planets = pd.read_csv('Planets.csv',usecols = ['FirstVisited'])
0    3/29/74
1    8/27/62
2        NaN
3    9/12/59
4    7/15/65
5    12/4/73
6     9/1/79
Name: FirstVisited, dtype: object

pd.to_datetime(planets.FirstVisited)
0   1974-03-29
1   2062-08-27
2          NaT
3   2059-09-12
4   2065-07-15
5   1973-12-04
6   1979-09-01

检查索引 1,3 和 4

【问题讨论】:

  • 我无法重现这个。在本地它解析得很好。
  • 预期的输出应该是什么?
  • 马里奥斯 - 1962-08-27、1959-09-12、1965-07-15
  • 你能分享一个csv样本吗?日期对我来说解析得很好,采用你想要的格式。
  • 如何分享?我可以在这里放置一个示例 CSV 文件,但不知道如何..

标签: python python-3.x pandas string-to-datetime


【解决方案1】:

这是因为大多数实现都假设 00-68 年属于 2000 年,69-99 年属于 1900 年。如果所有日期都是 19xx,也许您可​​以在更改之前在字符串的年份部分添加后缀“19”约会

如果所有日期都是 19xx 就可以了


import pandas as pd

planets = {'FirstVisited':['8/2/62', '9/12/59', '9/12/88']}

planets = pd.DataFrame(planets)


planets['FirstVisited'] = planets['FirstVisited'].str[0:-2] + '19' + planets['FirstVisited'].str[-2:]


planets['FirstVisited'] = pd.to_datetime(planets['FirstVisited'], format = "%d/%m/%Y", errors = 'coerce')



print(planets)


【讨论】:

  • 仔细阅读问题。
  • 我现在已经修改了我的解决方案。让我知道是否有帮助
【解决方案2】:

实际上这与您的代码无关! 这是编程语言(基本上是 C)中的“时间起源”。 C 的 time.h 头文件中时间的来源是“1970 January 1”。这就是为什么在那之前的日期你会得到错误的结果。 我建议您手动更正这些时间......类似于:

import pandas
x, y= pandas.readcsv('Planets.csv'), []
for i in x.FirstVisited:
    i= i.split('/')
    i[0], i[1], i[2]= '19'+i[2], i[0], i[1]
    y.append('-'.join(i))
print(y)

【讨论】:

    【解决方案3】:

    您可以使用pandas to_datetime 函数,参数errors='coerce' 将非日期转换为NaT 空值。在​​下面查看我的答案。

    import pandas as pd
    
    data = {'dates':["8/27/1962", "9/12/1959", "Nan"]}
    df = pd.DataFrame(data)
    
    df['dates'] = pd.to_datetime(df.dates,errors='coerce')
    #drop Nan from column
    df = df.dropna(subset=['dates'])
    
    lst = df['dates'].dt.strftime('%Y-%m-%d')
    
    print(lst)
    

    【讨论】:

      【解决方案4】:

      有点蛮力的方法,但如果你知道所有日期都是 19' 百,你可以这样做:

      import pandas as pd
      import datetime
      
      df=pd.DataFrame({"dt": ["8/27/62", "9/12/59", "7/15/65"], "x": list("abc")})
      
      df["dt"]=df["dt"].str.split(r"/").apply(lambda x: datetime.datetime(int(x[2])+1900, int(x[0]), int(x[1])))
      

      输出:

      #before:
              dt  x
      0  8/27/62  a
      1  9/12/59  b
      2  7/15/65  c
      
      #after:
                dt  x
      0 1962-08-27  a
      1 1959-09-12  b
      2 1965-07-15  c
      

      【讨论】:

        猜你喜欢
        • 2021-01-10
        • 2013-10-26
        • 1970-01-01
        • 2019-05-20
        • 2019-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-19
        相关资源
        最近更新 更多