根据日期范围和熊猫数据框创建新变量并应用条件值

时间:2019-11-03 09:22:09

标签: python pandas datetime

这是Python的新手,通常在这里进行编码,因此对于大多数人来说,这应该是非常基本的。

我基本上是用Datetime索引创建此数据框的。

这是数据框

df = pd.date_range(start='2018-01-01', end='2019-12-31', freq='D')

我现在想在我的df中添加一个名为“ vacation”的新变量,如果日期介于2018-06-24和2018-08-24之间,则值为1;如果不在这些日期之间,则值为0。 。我该怎么做呢? 我创建了一个具有一定休假范围的变量,但是我不确定如何将这两个变量放在一起并在数据框中为“休假”创建新列。

vacation = pd.date_range(start = '2018-06-24', end='2018-08-24')

谢谢。

2 个答案:

答案 0 :(得分:1)

DataFrame的解决方案:

i = pd.date_range(start='2018-01-01', end='2018-08-26', freq='D')

m = (i > '2018-06-24') & (i < '2018-08-24') 
df = pd.DataFrame({'vacation': m.astype(int)}, index=i)

或者:

df = pd.DataFrame({'vacation':np.where(m, 1, 0)}, index=i)

print (df)
            vacation
2018-01-01         0
2018-01-02         0
2018-01-03         0
2018-01-04         0
2018-01-05         0
             ...
2018-08-22         1
2018-08-23         1
2018-08-24         0
2018-08-25         0
2018-08-26         0

[238 rows x 1 columns]

将新列添加到现有DataFrame的解决方案:

通过比较DatetimeIndex&的{​​{1}}链接来创建掩码,并将其转换为整数(bitwise ANDTrue1False)或使用numpy.where

0

另一个具有i = pd.date_range(start='2018-01-01', end='2018-08-26', freq='D') df = pd.DataFrame({'a': 1}, index=i) m = (df.index > '2018-06-24') & (df.index < '2018-08-24') df['vacation'] = m.astype(int) #alternative #df['vacation'] = np.where(m, 1, 0) print (df) a vacation 2018-01-01 1 0 2018-01-02 1 0 2018-01-03 1 0 2018-01-04 1 0 2018-01-05 1 0 .. ... 2018-08-22 1 1 2018-08-23 1 1 2018-08-24 1 0 2018-08-25 1 0 2018-08-26 1 0 [238 rows x 2 columns] DataFrame.loc的解决方案-区别在于DatetimeIndex包含12018-06-24边值:

2018-08-24

答案 1 :(得分:0)

首先,pd.date_range(start='2018-01-01', end='2019-12-31', freq='D')将不会创建DataFrame,而是会创建DatetimeIndex。然后,可以将其作为索引或单独的列将其转换为DataFrame

# Having it as an index

datetime_index = pd.date_range(start='2018-01-01', end='2019-12-31', freq='D')
df = pd.DataFrame({}, index=datetime_index)
# Using numpy.where() to create the Vacation column
df['Vacation'] = np.where((df.index >= '2018-06-24') & (df.index <= '2018-08-24'), 1, 0)

enter image description here

# Having it as a column

datetime_index = pd.date_range(start='2018-01-01', end='2019-12-31', freq='D')
df = pd.DataFrame({'Date': datetime_index})
# Using numpy.where() to create the Vacation column
df['Vacation'] = np.where((df['Date'] >= '2018-06-24') & (df['Date'] <= '2018-08-24'), 1, 0)

enter image description here

注意:仅显示数据框df的前五行。