Python中选定日期数据的子集

Python中选定日期数据的子集,python,pandas,dataframe,time-series,Python,Pandas,Dataframe,Time Series,我有一些时间序列数据,如: import pandas as pd index = pd.date_range('06/01/2014',periods=24*30,freq='H') df1 = pd.DataFrame(range(len(index)),index=index) 现在我想将以下日期的数据子集 selec_dates = ['2014-06-10','2014-06-15','2014-06-20'] 我尝试了以下语句,但它不起作用 sub_data = df1.

我有一些时间序列数据,如:

import pandas as pd    
index = pd.date_range('06/01/2014',periods=24*30,freq='H')
df1 = pd.DataFrame(range(len(index)),index=index)
现在我想将以下日期的数据子集

selec_dates = ['2014-06-10','2014-06-15','2014-06-20']
我尝试了以下语句,但它不起作用

sub_data = df1.loc[df1.index.isin(pd.to_datetime(selec_dates))]

我哪里做错了?是否有其他方法可以将选定日期数据子集?

很抱歉,我误解了您的问题

df1[pd.Series(df1.index.date, index=df1.index).isin(pd.to_datetime(selec_dates).date)]
我们应该做需要的事情

原始答案 请检查所选内容的
pandas

你很容易做到

sub_data = df1.loc[pd.to_datetime(selec_dates)]

编辑:我已经知道,只有当您使用的日期范围与查询中的日期范围在同一月份和年份时,此选项才有效。有关更一般(更好的答案)的信息,请参阅解决方案

如果您想按尝试的方式操作,可以在索引上使用
np.inad
.day

selec_dates = ['2014-06-10','2014-06-15','2014-06-20']

df1.loc[np.in1d(df1.index.day, (pd.to_datetime(selec_dates).day))]
这将为您提供所需的:

2014-06-10 00:00:00  216
2014-06-10 01:00:00  217
2014-06-10 02:00:00  218
2014-06-10 03:00:00  219
2014-06-10 04:00:00  220
2014-06-10 05:00:00  221
2014-06-10 06:00:00  222
2014-06-10 07:00:00  223
2014-06-10 08:00:00  224
2014-06-10 09:00:00  225
2014-06-10 10:00:00  226
2014-06-10 11:00:00  227
2014-06-10 12:00:00  228
2014-06-10 13:00:00  229
2014-06-10 14:00:00  230
2014-06-10 15:00:00  231
2014-06-10 16:00:00  232
2014-06-10 17:00:00  233
2014-06-10 18:00:00  234
2014-06-10 19:00:00  235
2014-06-10 20:00:00  236
2014-06-10 21:00:00  237
2014-06-10 22:00:00  238
2014-06-10 23:00:00  239
2014-06-15 00:00:00  336
2014-06-15 01:00:00  337
2014-06-15 02:00:00  338
2014-06-15 03:00:00  339
2014-06-15 04:00:00  340
2014-06-15 05:00:00  341
                 ...
2014-06-15 18:00:00  354
2014-06-15 19:00:00  355
2014-06-15 20:00:00  356
2014-06-15 21:00:00  357
2014-06-15 22:00:00  358
2014-06-15 23:00:00  359
2014-06-20 00:00:00  456
2014-06-20 01:00:00  457
2014-06-20 02:00:00  458
2014-06-20 03:00:00  459
2014-06-20 04:00:00  460
2014-06-20 05:00:00  461
2014-06-20 06:00:00  462
2014-06-20 07:00:00  463
2014-06-20 08:00:00  464
2014-06-20 09:00:00  465
2014-06-20 10:00:00  466
2014-06-20 11:00:00  467
2014-06-20 12:00:00  468
2014-06-20 13:00:00  469
2014-06-20 14:00:00  470
2014-06-20 15:00:00  471
2014-06-20 16:00:00  472
2014-06-20 17:00:00  473
2014-06-20 18:00:00  474
2014-06-20 19:00:00  475
2014-06-20 20:00:00  476
2014-06-20 21:00:00  477
2014-06-20 22:00:00  478
2014-06-20 23:00:00  479

[72 rows x 1 columns]
我使用这些来源来回答:
-
-
-
-
-您可以使用以下方法:


使用日期的字符串repr,省去一天中的时间段

pd.concat([df1['2014-06-10'] , df1['2014-06-15'], df1['2014-06-20']])

您需要比较
日期
,对于测试成员身份,请使用:

如果要使用
isin
,需要创建具有相同索引的
系列

sub_data = df1.loc[pd.Series(df1.index.date, index=df1.index)
                     .isin(pd.to_datetime(selec_dates).date)]
print (sub_data)
                       a
2014-06-10 00:00:00  216
2014-06-10 01:00:00  217
2014-06-10 02:00:00  218
2014-06-10 03:00:00  219
2014-06-10 04:00:00  220
2014-06-10 05:00:00  221
2014-06-10 06:00:00  222
2014-06-10 07:00:00  223
2014-06-10 08:00:00  224
2014-06-10 09:00:00  225
2014-06-10 10:00:00  226
2014-06-10 11:00:00  227
...

@chuckm他使用了
pd.来记录时间
Super convicient@MaartenFabreThis这只给出了所选日期的第一次观察。我需要所有选定日期的24次观察结果。我在看到你的回复之前就开始编辑了,没问题,天气真好!你用了
.loc
,而我没有用t@jezrael你可以看到我用了
.day
,你用了
.date
真的没有看到我更改答案时你发了帖子。只是不想让你认为我会在没有提供来源的情况下说你的卓越是我自己的!:)很抱歉弄错了,杰兹。@jezrael我认为这是可行的,因为年和月是一样的,因为只有日期发生了变化(他的索引都在同一个月/年)。如果在
selec_日期中
在不同的月份或不同的年份中有不同的日期,则这是错误的。这有意义吗?像往常一样,对于任何可能的日期,你的答案都比一般情况好得多!并将其转换为1k;)@耶斯雷尔!!:D:我终于到了,哈哈。谢谢你说声祝贺!;)
sub_data = df1.loc[np.in1d(df1.index.date, pd.to_datetime(selec_dates).date)]
print (sub_data)
                      a
2014-06-10 00:00:00  216
2014-06-10 01:00:00  217
2014-06-10 02:00:00  218
2014-06-10 03:00:00  219
2014-06-10 04:00:00  220
2014-06-10 05:00:00  221
2014-06-10 06:00:00  222
2014-06-10 07:00:00  223
2014-06-10 08:00:00  224
2014-06-10 09:00:00  225
2014-06-10 10:00:00  226
...
sub_data = df1.loc[pd.Series(df1.index.date, index=df1.index)
                     .isin(pd.to_datetime(selec_dates).date)]
print (sub_data)
                       a
2014-06-10 00:00:00  216
2014-06-10 01:00:00  217
2014-06-10 02:00:00  218
2014-06-10 03:00:00  219
2014-06-10 04:00:00  220
2014-06-10 05:00:00  221
2014-06-10 06:00:00  222
2014-06-10 07:00:00  223
2014-06-10 08:00:00  224
2014-06-10 09:00:00  225
2014-06-10 10:00:00  226
2014-06-10 11:00:00  227
...