繁体   English   中英

根据数据框中的开始和结束日期更改年份

[英]Change year based on start and end date in dataframe

我在数据框中有一个名为 startEndDate 的列,例如:'10.12-20.05.2019',将它们分为同一年的 start_date 和 end_date 列,例如:start_date '10.12.2019' 和 end_date '20.05.2019'。 但是这个例子中的年份是错误的,因为它应该是 2018 年,因为开始日期不能晚于结束日期。 如何比较整个数据框并替换值,使其包含基于 if 语句的正确 start_dates(因为某些开始日期应与 2019 年保持一致)?

这将向您显示 start_date 比结束日期 > 的行

data = {
    'Start_Date' : ['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04'],
    'End_Date' : ['2020-02-01', '2019-01-02', '2019-01-03', '2020-01-05']
}
df = pd.DataFrame(data)
df['Start_Date'] = pd.to_datetime(df['Start_Date'], infer_datetime_format=True)
df['End_Date'] = pd.to_datetime(df['End_Date'], infer_datetime_format=True)
df['Check'] = np.where(df['Start_Date'] > df['End_Date'], 'Error', 'No Error')
df

在没有看到更多数据或预期的最终数据的情况下,这是我们能够做的最好的事情,以帮助识别数据中的问题。

此方法首先将日期字符串拆分为两个日期并创建开始日期和结束日期列。 如果大于结束日期,则从开始日期减去 1 年。

import pandas as pd
import numpy as np

# mock data
df = pd.DataFrame({"dates": ["10.12-20.05.2019", "02.04-31.10.2019"]})

# split date string to two dates, convert to datetime and stack to columns
df[["start", "end"]] = np.vstack(
    df.dates.apply(lambda x: pd.to_datetime(
        [x.split("-")[0] + x[-5:],
         x.split("-")[1]], format="%d.%m.%Y")))

# subtract 1 year from start date if greater than end date
df["start"] = np.where(df["start"]>df["end"],
                       df["start"] - pd.DateOffset(years=1),
                       df["start"])

df
#              dates      start        end
#0  10.12-20.05.2019 2018-12-10 2019-05-20
#1  02.04-31.10.2019 2019-04-02 2019-10-31

虽然我在这里使用split对字符串进行初始拆分,因为连字符前总是有 5 个字符,并且日期总是最后 5 个(带有. ),不需要使用 split 而是该行可以更改为:

df[["start", "end"]] = np.vstack(
    df.dates.apply(lambda x: pd.to_datetime(
        [x[:5] + x[-5:],
         x[6:]], format="%d.%m.%Y")))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM