Python 当输入限制为';时,如何将pd.to_datetime插入月的最后一天而不是第一天;yyyy-mm';?

Python 当输入限制为';时,如何将pd.to_datetime插入月的最后一天而不是第一天;yyyy-mm';?,python,pandas,Python,Pandas,我有一个pandas数据帧,其时间序列的形式如下: Date value 2020-01 1 2020-02 2 2020-03 3 例如,我想有效地将其转换为日期时间序列 如果您希望插入的日期部分为01 代码: import pandas as pd df = pd.DataFrame({'date': {0: '2020-01', 1: '2020-02', 2: '2020-03'}, 'value': {0: 1, 1: 2, 2: 3}}

我有一个pandas数据帧,其时间序列的形式如下:

Date  value
2020-01  1
2020-02  2
2020-03  3 
例如,我想有效地将其转换为日期时间序列

如果您希望插入的日期部分为
01

代码:

import pandas as pd
df = pd.DataFrame({'date': {0: '2020-01', 1: '2020-02', 2: '2020-03'},
                  'value': {0: 1, 1: 2, 2: 3}})
df['datetime']=pd.to_datetime(df['date'])
df
      date  value   datetime
0  2020-01      1 2020-01-01
1  2020-02      2 2020-02-01
2  2020-03      3 2020-03-01
      date  value   datetime
0  2020-01      1 2020-01-31
1  2020-02      2 2020-02-28
2  2020-03      3 2020-03-31
输出:

import pandas as pd
df = pd.DataFrame({'date': {0: '2020-01', 1: '2020-02', 2: '2020-03'},
                  'value': {0: 1, 1: 2, 2: 3}})
df['datetime']=pd.to_datetime(df['date'])
df
      date  value   datetime
0  2020-01      1 2020-01-01
1  2020-02      2 2020-02-01
2  2020-03      3 2020-03-01
      date  value   datetime
0  2020-01      1 2020-01-31
1  2020-02      2 2020-02-28
2  2020-03      3 2020-03-31
如您所见,我们假设首选的月份日期是月份的第一天。但是,你如何确保你得到的是一个月的最后一天呢

所需输出:

import pandas as pd
df = pd.DataFrame({'date': {0: '2020-01', 1: '2020-02', 2: '2020-03'},
                  'value': {0: 1, 1: 2, 2: 3}})
df['datetime']=pd.to_datetime(df['date'])
df
      date  value   datetime
0  2020-01      1 2020-01-01
1  2020-02      2 2020-02-01
2  2020-03      3 2020-03-01
      date  value   datetime
0  2020-01      1 2020-01-31
1  2020-02      2 2020-02-28
2  2020-03      3 2020-03-31

首先生成适当的字符串,然后转换

import calendar
get_last_day = lambda x: calendar.monthrange(*map(int, x.split('-')))[1]
df['datetime'] = pd.to_datetime(df.date.apply(lambda x: '{}-{}'.format(x, get_last_day(x))))
我认为在中不可能,可能的解决方案是在转换为datetimes后添加值:

df['datetime']=pd.to_datetime(df['date']) + pd.offsets.MonthEnd()
print (df)
      date  value   datetime
0  2020-01      1 2020-01-31
1  2020-02      2 2020-02-29
2  2020-03      3 2020-03-31

非常优雅,正是我想要的。非常感谢。我有一个小的后续问题。我试图查看公式文档,但无法理解
pd.offsets.MonthEnd()
如何知道它的结束月份。也许我在这里遗漏了一些非常明显的东西,但是你能简单地解释一下它的内部工作原理吗?@vesland-当然,如果检查-
基本的DateOffset行为类似于dateutil.relativedelta(relativedelta文档)这会将日期时间按指定的相应日历持续时间移动。
@vesland-因此,我认为这意味着它会检查日期并将最后一天添加到日期中,但内部工作的确切程度并不理想,因为不是熊猫开发公司再次向您询问另一个有价值的熊猫答案!