【问题标题】:using pd.to_datetime to form a date by taking input of year,months,day present in different columns in a data frame使用 pd.to_datetime 通过输入数据框中不同列中的年、月、日来形成日期
【发布时间】:2019-05-17 12:56:19
【问题描述】:

我在使用 pd.to_datetime 将日月年列组合成数据框中的日期列时遇到问题。下面是我正在处理的数据框,Yr、Mo、Dy 列代表年月日。

data = pd.read_table("/ALabs/wind.data",sep = ',')
Yr  Mo  Dy  RPT     VAL     ROS    KIL      
61  1   1   15.04   14.96   13.17  9.29
61  1   2   14.71   NaN     10.83  6.50 
61  1   3   18.50   16.88   12.33   10.13   

所以我尝试了以下代码,我收到以下错误:“组装映射需要至少指定 [年、月、日]:缺少 [日、月、年]”

第 1 步:

data['Date'] = pd.to_datetime(data[['Yr','Mo','Dy']],format="%y-%m-%d")

接下来,我尝试将 Yr、Mo、Dy 列数据类型从 int64 转换为 datetime64,并将结果分配给新列 Year、Month、Day。现在,当我尝试合并这些列时,我在新的日期列中得到了正确的日期格式,但我不知道我是如何得到想要的结果的。

第二步:

data['Year'] = pd.to_datetime(data.Yr,format='%y').dt.year
data['Month'] = pd.to_datetime(data.Mo,format='%m').dt.month
data['Day'] = pd.to_datetime(data.Dy,format ='%d').dt.day
data['Date'] =pd.to_datetime(data[['Year','Month','Day']])

结果:

Yr  Mo  Dy  Year Month Day  Date
61  1   1   2061    1   1   2061-01-01
61  1   2   2061    1   2   2061-01-02
61  1   3   2061    1   3   2061-01-03
61  1   4   2061    1   4   2061-01-04

但是,如果我尝试通过将列名从年、月、日更改为 Yy、Mh、Di 来执行相同的方法,如下面的代码所示。我收到同样的错误“组装映射至少需要指定 [年、月、日]:缺少 [日、月、年]”

第三步:

data['Yy'] = pd.to_datetime(data.Yr,format='%y').dt.year
data['Mh'] = pd.to_datetime(data.Mo,format='%m').dt.month
data['Di'] = pd.to_datetime(data.Dy,format ='%d').dt.day
data['Date'] =pd.to_datetime(data[['Yy','Mh','Di']]) 

我想知道的:

1) 如果我们使用 pd.to_datetime,参数名称是否必须为“年”“月”“日”?

2) 有没有其他方法可以将数据框中的列组合成日期,而不是使用这种长方法?

3) 这个错误是否只针对 python 3.7 版??

4)我在第 1 步和第 3 步中哪里出错了,为什么我在执行第 2 步时得到了 o/p?

【问题讨论】:

    标签: python pandas datetime dataframe


    【解决方案1】:

    根据pandas.to_datetime docs,列名确实必须是'year''month''day'(首字母大写即可)。这解释了你所有问题的答案,不,它与 Python 的版本无关(所有最新版本的 Pandas 行为相同)。

    此外,您应该知道,当您使用一系列列(而不是单个列/字符串列表)调用 to_datetime 时,format 参数似乎被忽略了。所以你需要自己规范你的年份(到196120611061等)。这是一个完整的示例,说明如何在一行中进行转换:

    import pandas as pd
    
    d = '''Yr  Mo  Dy  RPT     VAL     ROS    KIL      
    61  1   1   15.04   14.96   13.17  9.29
    61  1   2   14.71   NaN     10.83  6.50 
    61  1   3   18.50   16.88   12.33   10.13  '''
    data = pd.read_csv(pd.compat.StringIO(d), sep='\s+')
    
    dtime = pd.to_datetime({k:data[c]+v for c,k,v in zip(('Yr', 'Mo', 'Dy'), ('Year', 'Month', 'Day'), (1900, 0, 0))})
    print(dtime)
    

    输出:

    0   1961-01-01
    1   1961-01-02
    2   1961-01-03
    dtype: datetime64[ns]
    

    在上面的代码中,我没有将适当命名的列添加到数据框data,而是在键/值对所在的位置创建了一个字典。 ('Year', data['Yr']),并在年份中添加了1900

    您可以通过将1900 直接添加到相应的列来稍微简化字典理解:

    data['Yr'] += 1900
    dtime = pd.to_datetime({k:data[c] for c,k in zip(('Yr', 'Mo', 'Dy'), ('year', 'month', 'day'))})
    

    这段代码的输出与前面的相同。

    【讨论】:

      【解决方案2】:

      我真的不知道 Python 是如何处理年份的,但它不起作用的原因与您使用的是 61 年有关。

      这对我有用

      d = {'Day': ["1", "2","3"],
           'Month': ["1", "1","1"],
           'Year':["61", "61", "61"]}
      df = pd.DataFrame(data=d)
      df["Year"] = pd.to_numeric(df["Year"])
      df.Year = df.Year+2000
      df['Date'] = pd.to_datetime(df[['Year','Month','Day']], format='%Y%m%d')
      

      【讨论】:

        猜你喜欢
        • 2021-12-30
        • 1970-01-01
        • 2021-12-27
        • 1970-01-01
        • 1970-01-01
        • 2021-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多