从月度索引Python返回一列“月中的天数”

时间:2019-07-16 12:18:00

标签: python pandas

我有一个按月度值的时间序列,我想计算该月的天数(然后将该数字除以得到该月的每日平均值)。

我已经使用calendar.monthrange()通过遍历值来计算此值,但是我正在研究pandas.DataFrame.apply方法(https://medium.com/@rtjeannier/pandas-101-cont-9d061cb73bfc),想知道如何使用它来代替循环吗?

下面的代码为我提供了我想要的输出,但是出于效率(和学习)的目的,我想通过使用apply方法而不是循环来理解实现此目的的更好方法。

import pandas as pd
import calendar

df = pd.DataFrame()
df['temp'] = pd.date_range(start='01-Jan-2000', end='31-Dec-2018', freq='MS')  
df['value'] = 5
df.set_index('temp', inplace=True)

days_list = []
for val in df.index:
    days_list.append(calendar.monthrange(val.year, val.month)[1])

df['days_in_month'] = days_list

通过使用以下代码,我可以轻松轻松地找到索引的一行的天数:

calendar.monthrange(df.index[0].year, df.index[0].month)[1]

但是,如果我尝试对多个值进行操作(请参见下文),则会引发错误,我错过了如何在两者之间进行转换的方法。

calendar.monthrange(df.index.year, df.index.month)[1]

最终目标是创建一个列(就像循环一样),但是更有效,并且无需创建列表,就可以遍历,然后将列表添加到数据框。

2 个答案:

答案 0 :(得分:3)

mapdf.index一起使用:

df['days_in_month'] = df.index.map(lambda val: calendar.monthrange(val.year, val.month)[1])

答案 1 :(得分:1)

如何将索引列设置为常规列,然后使用daysinmonth

df['days_in_month'] = df.index.daysinmonth