如何在python中获取月份列表的第一天和最后一天?

时间:2019-04-24 19:43:58

标签: python pandas

如果我有一个自定义的天数列表,例如以下(但可以是任意天数):

import csv

txt_file = r"SentiWS_v1.8c_Positive.txt"
csv_file = r"NewProcessedDoc.csv"

with open(txt_file, "r") as in_text:
    in_reader = csv.reader(in_text, delimiter = '|')
    with open(csv_file, "w") as out_csv:
        out_writer = csv.writer(out_csv, newline='')
        for row in in_reader:
            out_writer.writerow(row)

如何从列表中提取每月/每年的第一个日期,并分别提取列表的最后日期?

我想这样做的一种方法是,如果我将清单放在from datetime import datetime, timedelta base = datetime.today() date_list = [base - timedelta(days=x) for x in range(0, 1000)] 中,然后将日期按各自的月份/年份分组,然后查看每个日期的天数,然后取最低的日期(对于第一个日期)和最高日期(最后一个日期)。

我只是不知道该怎么做。

要明确:我正在尝试在自定义列表中查找每月的第一天/最后一天。例如,如果我的名单中只有2018年2月15日。这将是我列表的第一天和最后一天。

2 个答案:

答案 0 :(得分:3)

创建一个DataFrame,然后使用resample汇总每个月的最大值和最小值。 normalize摆脱了时间部分。

import pandas as pd

(pd.DataFrame(data=pd.to_datetime(date_list).normalize(), index=date_list)
   .resample('MS')[0].agg([min, max]))

#                  min        max
#2016-07-01 2016-07-29 2016-07-31
#2016-08-01 2016-08-01 2016-08-31
#2016-09-01 2016-09-01 2016-09-30
#2016-10-01 2016-10-01 2016-10-31
#2016-11-01 2016-11-01 2016-11-30
#2016-12-01 2016-12-01 2016-12-31
#2017-01-01 2017-01-01 2017-01-31
#2017-02-01 2017-02-01 2017-02-28
#2017-03-01 2017-03-01 2017-03-31
#...

答案 1 :(得分:0)

我将使用石斑鱼并将每月的最小日期和每月的最大日期分开。

from datetime import datetime, timedelta

base = datetime.today()
date_list = [base - timedelta(days=x) for x in range(0, 35)]

df = pd.DataFrame(date_list, columns=['date_idx'])
df.index = df['date_idx']
df_min = df.groupby(pd.Grouper(freq='M')).agg(np.min).reset_index(drop=True)
df_max = df.groupby(pd.Grouper(freq='M')).agg(np.max).reset_index(drop=True)

print(df_min)
print(df_max)

结果:

                   date_idx
0 2019-03-21 16:16:58.991884
1 2019-04-01 16:16:58.991884

                    date_idx
0 2019-03-31 16:16:58.991884
1 2019-04-24 16:16:58.991884