我有一个列表dates
,其中日期作为字符串对象,日期从2003-01-01到2017-06-30:
['2003-01-01', '2003-01-02', '2003-01-03', '2003-01-04', '2003-01-05', '2003-01-06', '2003-01-07', '2003-01-08', '2003-01-09', '2003-01-10', '2003-01-11', '2003-01-12', '2003-01-13', '2003-01-14', '2003-01-15', '2003-01-16', '2003-01-17', '2003-01-18', '2003-01-19', '2003-01-20', '2003-01-21',...]
我有一个带有日期时间对象的数据框:
0 2013-01-09 09:07:49
1 2013-01-09 09:16:25
2 2013-01-09 11:14:28
3 2013-01-09 11:25:51
4 2013-01-09 11:25:51
5 2013-01-09 11:33:35
6 2013-01-09 11:35:31
7 2013-01-09 18:11:03
8 2013-03-13 21:04:58
9 2013-03-13 21:05:57
10 2013-03-15 14:07:27
11 2013-03-26 21:53:35
12 2013-03-26 22:19:20
13 2013-04-09 14:21:48
14 2013-04-09 14:22:29
15 2013-04-09 14:22:45
16 2013-04-22 12:10:47
...
然后我要检查列表dates
中的日期是否在数据框中存在。所以我想做这样的事情:
df = pd.read_csv("blabla.csv")
df['time'] = pd.to_datetime(df['time'])
for j in dates:
if j in df['time']:
return(yes)
如何在数据框中比较字符串对象和日期时间对象?
这是我的完整代码:
dates=[]
start = date(2003, 1, 1)
end = date(2017, 6, 30)
delta = end - start
for i in range(delta.days + 1):
newdate = start + timedelta(days=i)
dates.append(newdate.strftime("%Y-%m-%d"))
df = pd.read_csv("blabla.csv",parse_dates=True)
df['time'] = pd.to_datetime(df['time'])
答案 0 :(得分:0)
您可以在对read_csv的调用中使用parse_dates
df = pd.read_csv("blabla.csv",parse_dates=True)
这将导致日期时间对象而不是字符串。然后,您可以使用.isin
方法来查看一列的元素是否在另一列中。
df['time'].isin(dates)
这将为df ['time']中的每个值返回一系列True和False
答案 1 :(得分:0)
首先,我们将您的time
列转换为日期时间,因此我们只能使用Series.dt.dates
来访问日期。从您的日期时间中提取日期后,我们会将其转换为string
,以便可以将其与您的列表进行比较。
最后,我们使用isin
方法来创建新列作为指标。
df['Time'] = pd.to_datetime(df['Time'])
df['Indicator'] = df['Time'].dt.date.astype(str).isin(dates)
Time Indicator
0 2013-01-09 09:07:49 False
1 2013-01-09 09:16:25 False
2 2013-01-09 11:14:28 False
3 2013-01-09 11:25:51 False
4 2013-01-09 11:25:51 False
5 2013-01-09 11:33:35 False
6 2013-01-09 11:35:31 False
7 2013-01-09 18:11:03 False
8 2013-03-13 21:04:58 False
9 2013-03-13 21:05:57 False
10 2013-03-15 14:07:27 False
11 2013-03-26 21:53:35 False
12 2013-03-26 22:19:20 False
13 2013-04-09 14:21:48 False
14 2013-04-09 14:22:29 False
15 2013-04-09 14:22:45 False
16 2013-04-22 12:10:47 False
注意:您的列表不是一个很好的例子,因为数据框中不存在任何日期,这就是为什么它返回所有False的原因。
如果我使用的列表中有具有日期的数据框,则其外观将如下所示:
dates = ['2013-01-09', '2013-02-09', '2013-03-26']
df['Indicator'] = df['Time'].dt.date.astype(str).isin(dates)
Time Indicator
0 2013-01-09 09:07:49 True
1 2013-01-09 09:16:25 True
2 2013-01-09 11:14:28 True
3 2013-01-09 11:25:51 True
4 2013-01-09 11:25:51 True
5 2013-01-09 11:33:35 True
6 2013-01-09 11:35:31 True
7 2013-01-09 18:11:03 True
8 2013-03-13 21:04:58 False
9 2013-03-13 21:05:57 False
10 2013-03-15 14:07:27 False
11 2013-03-26 21:53:35 True
12 2013-03-26 22:19:20 True
13 2013-04-09 14:21:48 False
14 2013-04-09 14:22:29 False
15 2013-04-09 14:22:45 False
16 2013-04-22 12:10:47 False
有关isin的广泛信息:link