新列的日期和月份比现有日期和月份晚一天,并且偏移一行

时间:2014-12-09 12:32:36

标签: date pandas

我有一个DataFrame,其中YEAR END_DAYEND_MONTH的列为整数,我需要为START_DAYSTART_MONTH设置新列。开始日期应比上一行的结束日期晚一天(第一行应为START_DAYSTART_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)

1 个答案:

答案 0 :(得分:0)

据我所知,to_datetime期望字符串,你有整数。您可以创建新列,如:

aws['END_DATE']  = aws.apply(lambda x: datetime(x['YEAR'], x['END_MONTH'], x['END_DAY']), axis=1)