Pandas Lambda函数格式月份和日期

Pandas Lambda函数格式月份和日期,pandas,date,lambda,Pandas,Date,Lambda,我有一个DF“ltyc”看起来像这样: month day wind_speed 0 1 1 11.263604 1 1 2 11.971495 2 1 3 11.989080 3 1 4 12.558736 4 1 5 11.850899 month day wind_speed date 0 1 1 11.263604 2020-01-01 1

我有一个DF“ltyc”看起来像这样:

month  day  wind_speed
0      1    1   11.263604
1      1    2   11.971495
2      1    3   11.989080
3      1    4   12.558736
4      1    5   11.850899
month  day  wind_speed       date
0      1    1   11.263604 2020-01-01
1      1    2   11.971495 2020-01-01
2      1    3   11.989080 2020-01-01
3      1    4   12.558736 2020-01-01
4      1    5   11.850899 2020-01-01
我应用一个lambda函数:

ltyc['date'] = pd.to_datetime(ltyc["month"], format='%m').apply(lambda dt: dt.replace(year=2020))
要使其看起来像这样:

month  day  wind_speed
0      1    1   11.263604
1      1    2   11.971495
2      1    3   11.989080
3      1    4   12.558736
4      1    5   11.850899
month  day  wind_speed       date
0      1    1   11.263604 2020-01-01
1      1    2   11.971495 2020-01-01
2      1    3   11.989080 2020-01-01
3      1    4   12.558736 2020-01-01
4      1    5   11.850899 2020-01-01
除了,我需要它看起来像这样,这样日子也会改变…但是我不知道如何格式化lambda语句来代替它,因为这是我需要的

month  day  wind_speed       date
0      1    1   11.263604 2020-01-01
1      1    2   11.971495 2020-01-02
2      1    3   11.989080 2020-01-03
3      1    4   12.558736 2020-01-04
4      1    5   11.850899 2020-01-05
我试过这个:

ltyc['date'] = pd.to_datetime(ltyc["month"], format='%m%d').apply(lambda dt: dt.replace(year=2020))
我得到了这个错误:

ValueError: time data '1' does not match format '%m%d' (match)

感谢您的帮助,因为我正在尝试找出lambda函数。

创建一个具有值
2020
和名称
year
的系列。将其连接到
['month','day']
并传递到
pd.to\u datetime
。只要按以下顺序传递列名称为的数据帧
年、月、日
,pd.to_datetime将其转换为适当的日期时间序列

@Allolz建议:

ltyc['date'] = pd.to_datetime(ltyc[['day', 'month']].assign(year=2020))

Out[367]:
   month  day  wind_speed       date
0      1    1   11.263604 2020-01-01
1      1    2   11.971495 2020-01-02
2      1    3   11.989080 2020-01-03
3      1    4   12.558736 2020-01-04
4      1    5   11.850899 2020-01-05
或者您可以使用
reindex
创建要传递给
pd.to\u datetime

ltyc['date'] = pd.to_datetime(ltyc.reindex(['year','month','day'], 
                                           axis=1, fill_value=2020))

原件

s = pd.Series([2020]*len(ltyc), name='year')
ltyc['date'] = pd.to_datetime(pd.concat([s, ltyc[['month','day']]], axis=1))

您还可以使用您的方法,将
.astype(str)
一起添加,然后将
%d
添加到格式中。你的lambda的问题是你只考虑月份,所以这就是你考虑月和日的方式。
ltyc['date'] = (pd.to_datetime(ltyc["month"].astype(str) + '-' + ltyc["day"].astype(str),
                               format='%m-%d')
                .apply(lambda dt: dt.replace(year=2020)))
输出:

    month   day wind_speed  date
0   1       1   11.263604   2020-01-01
1   1       2   11.971495   2020-01-02
2   1       3   11.989080   2020-01-03
3   1       4   12.558736   2020-01-04
4   1       5   11.850899   2020-01-05

这与前面的答案类似,但不会将“helper”列与年份保持一致。简而言之,我们将一个包含三列(年、月、日)的数据框传递给
to_datetime()
函数

ltyc['date'] = pd.to_datetime(ltyc
                              .assign(year=2020)
                              .filter(['year', 'month', 'day'])
                             )


@阿洛兹:哈哈。。。你是对的。我非常关心列的顺序,所以我使用了
pd.concat
:D