gpt4 book ai didi

python - 根据日期列范围将列添加到数据框

转载 作者:行者123 更新时间:2023-12-01 03:39:59 25 4
gpt4 key购买 nike

我有一个包含n df。其中之一是名为 date,其中包含格式为 mm-dd-yy 的值。现在我想向我的 df 添加一个 interval。此应返回日期中包含的年份,但也返回H1H2 >。 H1 是一年半,应该是 01-dd-yy 06-dd-yy 之间的所有 date 值因此,H2 应该是 07-dd-yy12-dd-yy 之间的所有日期值。

这是df['date']中的数据示例:

0         01-27-16
1 02-27-16
2 03-27-16
3 04-27-16
4 05-27-16
5 06-27-16
6 07-27-16
7 08-24-16
8 09-24-16
9 10-16-15
...etc...

df 中,我想添加另一个名为 interval 的列,其中包含:

    0         16H1
1 16H1
2 16H1
3 16H1
4 16H1
5 16H1
6 16H2
7 16H2
8 16H2
9 15H2
...etc...

所以我想我应该创建一个函数,然后使用map

def is_in_range(x):
if x['date'] >= '01-01-16' x['date'] <= '06-31-16':
print '16H1'
elif x['date'] >= '07-01-16' and x['date'] <= '12-31-16':
print '16H2'
elif x['date'] >= '01-01-15' and x['date'] <= '06-31-15':
print '15H1'
elif x['date'] >= '07-01-15' and x['date'] <= '12-31-15':
print '15H2'
...etc...

我这样调用该函数:

df.groupby(df['date'].map(is_in_range))

现在这给了我:

`TypeError: 'Timestamp' object has no attribute 'getitem'

首先。我不知道为什么,但无论如何,肯定有更好的方法吗?

最佳答案

您可以使用dt.quarterdt.month .

首先将int年份值通过astype转换为str ,然后选择最后 2 个字符。最后使用numpy.where条件:

#first convert to datetime if not datetime
df.date = pd.to_datetime(df.date)

df['interval'] = df.date.astype(str).str[2:4] + np.where(df.date.dt.month < 7, 'H1','H2')
print (df)
date interval
0 2016-01-27 16H1
1 2016-02-27 16H1
2 2016-03-27 16H1
3 2016-04-27 16H1
4 2016-05-27 16H1
5 2016-06-27 16H1
6 2016-07-27 16H2
7 2016-08-24 16H2
8 2016-09-24 16H2
9 2015-10-16 15H2

或者:

df['interval'] = df.date.astype(str).str[2:4] + np.where(df.date.dt.quarter < 3,'H1','H2')
print (df)
date interval
0 2016-01-27 16H1
1 2016-02-27 16H1
2 2016-03-27 16H1
3 2016-04-27 16H1
4 2016-05-27 16H1
5 2016-06-27 16H1
6 2016-07-27 16H2
7 2016-08-24 16H2
8 2016-09-24 16H2
9 2015-10-16 15H2

字符串解决方案:

df['interval'] = df.date.str[6:] + np.where(df.date.str[:2].astype(int) < 7, 'H1','H2')
print (df)
date interval
0 01-27-16 16H1
1 02-27-16 16H1
2 03-27-16 16H1
3 04-27-16 16H1
4 05-27-16 16H1
5 06-27-16 16H1
6 07-27-16 16H2
7 08-24-16 16H2
8 09-24-16 16H2
9 10-16-15 15H2

列表理解解决方案如果不是 NaN 则有效:

字符串列:

df['interval'] = [x[6:] + 'H1' if int(x[:2])< 7 else x[6:] + 'H2' for x in df['date']]

日期时间列:

#first convert to datetime if not datetime
df.date = pd.to_datetime(df.date)

df['interval'] = [x[2:4] + 'H1' if int(x[5:7])< 7 else x[2:4] + 'H2' for x in df['date'].astype(str)]

print (df)
date interval
0 01-27-16 16H1
1 02-27-16 16H1
2 03-27-16 16H1
3 04-27-16 16H1
4 05-27-16 16H1
5 06-27-16 16H1
6 07-27-16 16H2
7 08-24-16 16H2
8 09-24-16 16H2
9 10-16-15 15H2

关于python - 根据日期列范围将列添加到数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39747222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com