我有一个DataFrame,其中YEAR
END_DAY
和END_MONTH
的列为整数,我需要为START_DAY
和START_MONTH
设置新列。开始日期应比上一行的结束日期晚一天(第一行应为START_DAY
,START_MONTH
均等于1)。
我的问题是我无法让pandas创建日期列,然后我可以应用timedelta。这是我的违规行:
aws['END_DATE'] = pandas.to_datetime(aws['YEAR'],
aws['END_MONTH'],
aws['END_DAY'], format="%m,%d")
追溯:
File "C:\Python27\Lib\site-packages\pandas\tseries\tools.py", line 136, in to_datetime
values = _convert_listlike(arg.values, box=False)
File "C:\Python27\Lib\site-packages\pandas\tseries\tools.py", line 115, in _convert_listlike
result = tslib.array_strptime(arg, format, coerce=coerce)
File "tslib.pyx", line 1255, in pandas.tslib.array_strptime (pandas\tslib.c:20089)
TypeError: expected string or buffer
编辑:上面问题的部分是通过传递@Roman Pekar的答案(或链接的副本)中的字符串来解决的,但是他们没有解决问题的其他部分。我有一个解决方案(下图),但我会对任何更好的选择感兴趣。
aws['END_DATE'] = pandas.to_datetime((aws['YEAR'] * 10000 +
aws['END_MONTH'] * 100 +
aws['END_DAY']).astype(str),
format="%Y%m%d")
aws['START_DATE'] = aws['END_DATE'] + datetime.timedelta(days=1)
aws['START_DATE'] = aws['START_DATE'].shift(1)
aws['START_DATE'][0] = datetime.datetime(2000, 1, 1)
aws['START_DAY'] = aws['START_DATE'].apply(lambda x: x.day)
aws['START_MONTH'] = aws['START_DATE'].apply(lambda x: x.month)
答案 0 :(得分:0)
据我所知,to_datetime
期望字符串,你有整数。您可以创建新列,如:
aws['END_DATE'] = aws.apply(lambda x: datetime(x['YEAR'], x['END_MONTH'], x['END_DAY']), axis=1)