我在使用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?
答案 0 :(得分:1)
根据pandas.to_datetime
docs,列名确实必须为'year'
,'month'
和'day'
(首字母大写就可以了)。这就解释了您所有问题的答案,并且与Python版本(和所有最新的Pandas版本都具有相同的行为)无关。
另外,您应该意识到,当您使用一系列列(而不是单个列/字符串列表)来调用to_datetime
时,format
参数似乎被忽略了。因此,您需要自己对年份(对1961
或2061
或1061
等进行标准化)。下面是一个完整的示例,说明如何单行转换:
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')