Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过忽略数据帧中的秒值来比较两个日期_Python_Pandas_Dataframe - Fatal编程技术网

Python 通过忽略数据帧中的秒值来比较两个日期

Python 通过忽略数据帧中的秒值来比较两个日期,python,pandas,dataframe,Python,Pandas,Dataframe,这是数据帧1 index date Count 4 2021-01-08 07:52:18 1 3 2021-01-08 08:53:34 10 0 2021-01-09 07:56:54 12 5 2021-01-09 09:52:17 13 1 2021-01-12 07:55:58 5 这是数据帧2 date Count 2021-01-08 07:5

这是数据帧1

index                 date  Count
4      2021-01-08 07:52:18   1
3      2021-01-08 08:53:34   10
0      2021-01-09 07:56:54   12
5      2021-01-09 09:52:17   13
1      2021-01-12 07:55:58   5
这是数据帧2

date                  Count
2021-01-08 07:52:00    0
2021-01-08 07:53:00    0
2021-01-08 07:54:00    0
2021-01-08 07:55:00    0
2021-01-08 07:56:00    0
...                    ...
2021-01-14 08:45:00    0
2021-01-14 08:46:00    0
2021-01-14 08:47:00    0
2021-01-14 08:48:00    0
2021-01-14 08:49:00    0

[8698 rows x 1 columns]
我需要将第一个数据帧的计数设置为第二个数据帧的计数。 从dataframe 1读取值并在datagrame 2中搜索。如果找到,则替换计数值


但问题是第一个数据帧中的“
seconds
”值。在进行比较时,是否可以忽略它。(我可以创建逻辑,但我需要一些快速方法,可能是python或pandas中的内置函数)

正如@anky所建议的,您可以在df上创建日期,因为这是一个较小的数据帧。然后合并数据

import pandas as pd
df1 = pd.DataFrame({'date':['2021-01-08 07:52:18','2021-01-08 08:53:34',
                            '2021-01-09 07:56:54','2021-01-09 09:52:17',
                            '2021-01-12 07:55:58'],
                    'count':[1,10,12,13,5]})
df2 = pd.DataFrame({'date':pd.date_range('2021-01-08 07:52:00',periods=9000,freq='T'),
                    'count':[0]*9000})

print (df2)

df1['date'] = pd.to_datetime(df1['date'])
df1['date_str'] = df1['date'].dt.floor('T')

df2 = df2.merge(df1[['date_str','count']],left_on='date',right_on='date_str', how='left')

df2.drop(columns=['date_str','count_x'],inplace=True)
df2.rename(columns={'count_y':'count'},inplace=True)
print (df2)
其输出将为:

df1:

df2:与df1合并后

                    date  count
0    2021-01-08 07:52:00    1.0
1    2021-01-08 07:53:00    NaN
2    2021-01-08 07:54:00    NaN
3    2021-01-08 07:55:00    NaN
4    2021-01-08 07:56:00    NaN
...                  ...    ...
8995 2021-01-14 13:47:00    NaN
8996 2021-01-14 13:48:00    NaN
8997 2021-01-14 13:49:00    NaN
8998 2021-01-14 13:50:00    NaN
8999 2021-01-14 13:51:00    NaN

如果在分钟内运行df1并重新采样,它将从最小日期和时间向上采样到最大日期和时间。如果您使用df2的索引对其进行重新索引,您将获得所需的输出。我借用了一些代码从@Joe Ferndz创建数据

import pandas as pd
df1 = pd.DataFrame({'date':['2021-01-08 07:52:18','2021-01-08 08:53:34',
                            '2021-01-09 07:56:54','2021-01-09 09:52:17',
                            '2021-01-12 07:55:58'],
                    'count':[1,10,12,13,5]})
df1['date'] = pd.to_datetime(df1['date'])
df1.set_index('date', inplace=True)
df1 = df1.resample('min').sum()

d_range = pd.date_range('2021-01-08 07:52:00', '2021-01-14 08:49:00', freq='1min')
df2 = pd.DataFrame(index=d_range)

df1 = df1.reindex(df2.index, fill_value=0)
df1

    count
2021-01-08 07:52:00     1
2021-01-08 07:53:00     0
2021-01-08 07:54:00     0
2021-01-08 07:55:00     0
2021-01-08 07:56:00     0
...     ...
2021-01-14 08:45:00     0
2021-01-14 08:46:00     0
2021-01-14 08:47:00     0
2021-01-14 08:48:00     0
2021-01-14 08:49:00     0

您只想比较小时和分钟的值?如果您将两者转换为strftime(“%Y%m%d%H:%m”)并匹配它们,您应该能够得到您想要的。是吗?@MayankPorwal date,hour,minuteFloor在df中输入日期,然后比较/合并/映射:
df['date'].dt.floor('T')
?请尝试
df2['date'].map(dict(zip(df1['date'].dt.floor('T'),df1['Count']))。fillna(df2['Count'])
@JoeFerndz是的,这可能是一个选项。但这不是因为内存昂贵。如果我有30天的数据。我想这将是数百万张唱片。
import pandas as pd
df1 = pd.DataFrame({'date':['2021-01-08 07:52:18','2021-01-08 08:53:34',
                            '2021-01-09 07:56:54','2021-01-09 09:52:17',
                            '2021-01-12 07:55:58'],
                    'count':[1,10,12,13,5]})
df1['date'] = pd.to_datetime(df1['date'])
df1.set_index('date', inplace=True)
df1 = df1.resample('min').sum()

d_range = pd.date_range('2021-01-08 07:52:00', '2021-01-14 08:49:00', freq='1min')
df2 = pd.DataFrame(index=d_range)

df1 = df1.reindex(df2.index, fill_value=0)
df1

    count
2021-01-08 07:52:00     1
2021-01-08 07:53:00     0
2021-01-08 07:54:00     0
2021-01-08 07:55:00     0
2021-01-08 07:56:00     0
...     ...
2021-01-14 08:45:00     0
2021-01-14 08:46:00     0
2021-01-14 08:47:00     0
2021-01-14 08:48:00     0
2021-01-14 08:49:00     0