基于行中值的“开始”和“结束”日期

维罗

我有一个输入数据的示例,可以在这里找到

输入 在此处输入图片说明

我需要根据每行中的数据添加2列:“ Begin_date”和“ End_date”:

  • 开始日期-当所有先前的单元格都为空并且日期从yyyymm01开始时
  • End_date-当所有后续项都为空时:
  • 如果所有后续值都不为空,则添加“终身”日期:“ 99991231”
  • 否则-yyyymm30或31或28(取决于月份)

输出示例:

在此处输入图片说明

我将不胜感激:)谢谢

tawab_shakeel

使用pd.melt()
按ID和日期对数据进行排序

import pandas as pd
import numpy as np
from pandas.tseries.offsets import MonthEnd

df = pd.read_excel("input.xlsx")
max_date = df.columns[-1]

res = pd.melt(df, id_vars=['id', 'region'], value_vars=df.columns[2:])
res.dropna(subset=['value'], inplace=True)

res.sort_values(by=['id', 'variable'], ascending=[True, True], inplace=True)

minimum_date = res.drop_duplicates(subset=['id'], keep='first')
maximum_date = res.drop_duplicates(subset=['id'], keep='last')

minimum_date.rename(columns={'variable': 'start_date'}, inplace=True)
maximum_date.rename(columns={'variable': 'end_date'}, inplace=True)

df = pd.merge(df, minimum_date[['id', 'start_date']], on=['id'], how='left')
df = pd.merge(df, maximum_date[['id', 'end_date']], on=['id'], how='left')

df['end_date'] = np.where(df['end_date']==max_date,
                          "99991231",df['end_date'])

df['start_date'] = (pd.to_datetime(df['start_date'],format="%Y%m",errors='coerce') +MonthEnd(1)).astype(str)
df['end_date'] = (pd.to_datetime(df['end_date'],format="%Y%m",errors='coerce') +MonthEnd(1)).astype(str)

df['end_date'] = np.where(df['end_date']=='NaT',
                          "99991231",df['end_date'])
print(df)

      id  region  201801  201802  ...  201905  201906  start_date    end_date
0  100001     628     NaN     NaN  ...    26.0    23.0  2018-09-30    99991231
1  100002    1149    27.0    24.0  ...    26.0    24.0  2018-01-31    99991231
2  100003    1290    26.0    26.0  ...    27.0    25.0  2018-01-31    99991231
3  100004     955    25.0    26.0  ...     NaN     NaN  2018-01-31  2018-12-31
4  100005    1397    15.0    25.0  ...     NaN     NaN  2018-01-31  2018-11-30
5  100006    1397    15.0    25.0  ...     NaN     NaN  2018-01-31  2019-02-28

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

基于开始日期和结束日期的 Tableau 体积计算

基于 GETDATE() 的财政季度开始和结束日期

基于日期开始和结束在 FullCalendar 上重复事件

基于开始和结束日期的年/月记录返回金额

使用开始和结束日期按日期范围扩展行

根据开始日期和结束日期重复行

基于开始和结束的 MS SQL 组行

如何基于当前周红宝石中的日期获取上周开始日期和结束日期

基于服务日期列的 YTD 月份开始日期和结束日期 - SQL Server

如何开始和结束日期

聚合行开始和结束日期 < 10 分钟

我如何基于另一行的开始日期获取一行的结束日期

从开始和结束日期开始活跃的几周

使用时刻js显示基于开始日期和结束日期的时间间隔

在Google表格中使用Google脚本基于图表“开始日期”和“结束日期”的颜色单元

基于一天的开始日期和结束日期的Django过滤器

开始日期和结束日期的对齐

获取开始日期和结束日期

日期范围中的开始和结束日期

用开始日期和结束日期聚合

开始日期和结束日期的 Sas 循环

Bootstrap中的开始日期和结束日期

AngularJS开始日期和结束日期验证

选定日期的开始和结束日期

AngularJS中的开始日期和结束日期

Spark窗口功能:筛选出开始日期和结束日期在另一行开始日期和结束日期范围内的行

多个日期行以间隔开始日期和结束日期在 df 中转入 2 列

如何选择今天的日期在开始日期和结束日期之间的行

如果日期列在开始日期和结束日期之间,则选择行FMDB请求