Python_Pandas:如果日期时间值在特定日期持续时间内,则创建一个具有特定值的列
Python_Pandas: If datetime values fall under certain date duration, create a column with specific value
给定:
从df下方开始,
df = pd.DataFrame(
{"date":['2016-6-1', '2016-9-22', '2016-10-28', '2016-11-4', '2016-6-29', '2016-10-1', '2016-6-15', '2016-7-29', '2016-11-1'],
"score":[9, 8, 8, 10, 6, 7, 7, 7, 6]
})
执行以下任务:
对于满足以下条件的日期,将特定值添加到名为 'staffNumber' 的新添加列:
如果 'date' 属于 6/1/2016~9/22/2016 THAN 创建一个值为 1 的新列。
如果 'date' 属于 9/23/2016~10/28/2016 THAN 创建一个值为 2 的新列。
如果 'date' 属于 10/29/2016~11/4/2016 THAN 创建一个值为 3
的新列
最终结果将如下所示:
df2 = pd.DataFrame(
{"date":['2016-6-1', '2016-9-22', '2016-10-28', '2016-11-4', '2016-6-29', '2016-10-1', '2016-6-15', '2016-7-29', '2016-11-1'],
"score":[9, 8, 8, 10, 6, 7, 7, 7, 6],
"staffNumber":[1,1,2,3,1,2,1,1,3]
})
我尝试过的:
我通常在问任何问题之前先尝试一下。但是,对于这个,我想不出任何方法。
我从以下链接查看了使用 np.where & .isin:
1. Python numpy where function with datetime
2.
3. Pandas conditional creation of a series/dataframe column
任何帮助将不胜感激!
使用cut
:
#convert to datetimes if necessary
df['date'] = pd.to_datetime(df['date'])
b = pd.to_datetime(['2016-06-01','2016-09-22','2016-10-28','2016-11-04'])
l = range(1,4)
df['new'] = pd.cut(df['date'], bins=b, labels=l, include_lowest=True)
print (df)
date score new
0 2016-06-01 9 1
1 2016-09-22 8 1
2 2016-10-28 8 2
3 2016-11-04 10 3
4 2016-06-29 6 1
5 2016-10-01 7 2
6 2016-06-15 7 1
7 2016-07-29 7 1
8 2016-11-01 6 3
#change first date to 2016-05-31
b = pd.to_datetime(['2016-05-31','2016-09-22','2016-10-28','2016-11-04'])
l = range(1,4)
df['new'] = np.array(l)[b.searchsorted(df['date'].values) - 1]
print (df)
date score new
0 2016-06-01 9 1
1 2016-09-22 8 1
2 2016-10-28 8 2
3 2016-11-04 10 3
4 2016-06-29 6 1
5 2016-10-01 7 2
6 2016-06-15 7 1
7 2016-07-29 7 1
8 2016-11-01 6 3
一般而言,要完成此操作,您需要创建一个列,而不考虑日期值。
df['employee'] = ...some_value_here...
然后你需要在日期在你指定的范围内时赋值。你可以用 lambda 来做:
df['employee'] = df['date'].apply( lambda x : __something__ )
现在您已将 lambda 中的 __something__ 替换为将日期范围(字符串!)分配给您需要的值的逻辑。
如果 lambda 中的 __something__ 很长,它将不可读:定义一个函数在它之前执行它并应用(lambda x:justdefinedfunction( x) )
这个问题似乎有点老了,但我最近也有类似的需求,下面是我如何让它工作的:
def staffNumber(date):
if datetime.date(2016, 1, 6) <= date <= datetime.date(2016, 9, 22):
return 1
elif datetime.date(2016, 9, 23) <= date <= datetime.date(2016, 10, 28):
return 2
"""#(include all the other IFs and date ranges here)"""
else:
return 'input date out of range'
df['staffNumber'] = df.date.apply(lambda x: fiscalweek(x) )
给定:
从df下方开始,
df = pd.DataFrame(
{"date":['2016-6-1', '2016-9-22', '2016-10-28', '2016-11-4', '2016-6-29', '2016-10-1', '2016-6-15', '2016-7-29', '2016-11-1'],
"score":[9, 8, 8, 10, 6, 7, 7, 7, 6]
})
执行以下任务:
对于满足以下条件的日期,将特定值添加到名为 'staffNumber' 的新添加列:
如果 'date' 属于 6/1/2016~9/22/2016 THAN 创建一个值为 1 的新列。
如果 'date' 属于 9/23/2016~10/28/2016 THAN 创建一个值为 2 的新列。
如果 'date' 属于 10/29/2016~11/4/2016 THAN 创建一个值为 3
的新列最终结果将如下所示:
df2 = pd.DataFrame(
{"date":['2016-6-1', '2016-9-22', '2016-10-28', '2016-11-4', '2016-6-29', '2016-10-1', '2016-6-15', '2016-7-29', '2016-11-1'],
"score":[9, 8, 8, 10, 6, 7, 7, 7, 6],
"staffNumber":[1,1,2,3,1,2,1,1,3]
})
我尝试过的:
我通常在问任何问题之前先尝试一下。但是,对于这个,我想不出任何方法。
我从以下链接查看了使用 np.where & .isin:
1. Python numpy where function with datetime
2.
任何帮助将不胜感激!
使用cut
:
#convert to datetimes if necessary
df['date'] = pd.to_datetime(df['date'])
b = pd.to_datetime(['2016-06-01','2016-09-22','2016-10-28','2016-11-04'])
l = range(1,4)
df['new'] = pd.cut(df['date'], bins=b, labels=l, include_lowest=True)
print (df)
date score new
0 2016-06-01 9 1
1 2016-09-22 8 1
2 2016-10-28 8 2
3 2016-11-04 10 3
4 2016-06-29 6 1
5 2016-10-01 7 2
6 2016-06-15 7 1
7 2016-07-29 7 1
8 2016-11-01 6 3
#change first date to 2016-05-31
b = pd.to_datetime(['2016-05-31','2016-09-22','2016-10-28','2016-11-04'])
l = range(1,4)
df['new'] = np.array(l)[b.searchsorted(df['date'].values) - 1]
print (df)
date score new
0 2016-06-01 9 1
1 2016-09-22 8 1
2 2016-10-28 8 2
3 2016-11-04 10 3
4 2016-06-29 6 1
5 2016-10-01 7 2
6 2016-06-15 7 1
7 2016-07-29 7 1
8 2016-11-01 6 3
一般而言,要完成此操作,您需要创建一个列,而不考虑日期值。
df['employee'] = ...some_value_here...
然后你需要在日期在你指定的范围内时赋值。你可以用 lambda 来做:
df['employee'] = df['date'].apply( lambda x : __something__ )
现在您已将 lambda 中的 __something__ 替换为将日期范围(字符串!)分配给您需要的值的逻辑。
如果 lambda 中的 __something__ 很长,它将不可读:定义一个函数在它之前执行它并应用(lambda x:justdefinedfunction( x) )
这个问题似乎有点老了,但我最近也有类似的需求,下面是我如何让它工作的:
def staffNumber(date):
if datetime.date(2016, 1, 6) <= date <= datetime.date(2016, 9, 22):
return 1
elif datetime.date(2016, 9, 23) <= date <= datetime.date(2016, 10, 28):
return 2
"""#(include all the other IFs and date ranges here)"""
else:
return 'input date out of range'
df['staffNumber'] = df.date.apply(lambda x: fiscalweek(x) )