使用pd.to_datetime通过输入数据框中不同列中出现的年,月,日来形成日期

时间:2018-12-17 07:15:33

标签: python pandas datetime dataframe

我在使用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来执行相同的方法,如下面的代码所示。我收到相同的错误“组装映射至少需要指定[年,月,日]:[天,月,年]丢失”

Step3:

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)是否有其他方法可以合并数据框中的列以形成日期,而不是使用此long方法?

3)此错误仅特定于python版本3.7吗?

4)在第1步和第3步中我哪里出错了?为什么我在遵循第2步时会出现o / p?

2 个答案:

答案 0 :(得分: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直接添加到适当的列中来简化dict理解:

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

此代码将具有与以前相同的输出。

答案 1 :(得分:0)

我真的不知道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')