如何使用numpy或pandas或Python从datetime64的列表列表中扁平化和删除重复项

gorkyyrv  于 12个月前  发布在  Python
关注(0)|答案(3)|浏览(84)

在Python中,我有一个pandas时间戳列表,例如。考虑以下输入提示input: list[list[pd.Timestamp]]

import pandas as pd
import numpy as np

# Example list of lists of Pandas Timestamps
input = [[pd.Timestamp('2023-09-01 10:00:00'), pd.Timestamp('2023-09-01 11:00:00')],
        [pd.Timestamp('2023-09-02 12:00:00'), pd.Timestamp('2023-09-02 13:00:00')],
        [pd.Timestamp('2023-09-03 14:00:00'), pd.Timestamp('2023-09-03 15:00:00')]]

此输入表示日期时间范围的列表。为了调试和简单起见,我更喜欢将此信息视为一个框架:

input_df = pd.DataFrame(input, columns=[['left', 'right']])

现在我需要:
1.展平输入
1.删除重复项
1.应用相同的字符串格式(以矢量化的方式,例如所有元素上的strftime("%Y/%m/%d/%H")
现在,我应该在pandas,numpy(因为所有元素都是相同类型的)还是Python中这样做?什么是最快、最优雅的方法?

e7arh2l6

e7arh2l61#

如果需要在左列和右列之间获取所有小时数(如果差值为2小时或更多),则用途:

#remove nested list in columns names for avoid MultiIndex
input_df = pd.DataFrame(input, columns=['left', 'right'])

#substract columns and convert to hours difference
repeat = input_df['right'].sub(input_df['left']).dt.total_seconds().div(3600).add(1)

#repeat left column
s = input_df.loc[input_df.index.repeat(repeat), 'left']

#add counter by hours, remove dupes and convert to custom format
out = (s.add(pd.to_timedelta(s.groupby(s).cumcount(), unit='H')).drop_duplicates()
               .dt.strftime("%Y/%m/%d/%H").tolist())

print (out)
['2023/09/01/10', '2023/09/01/11', '2023/09/02/12',
 '2023/09/02/13', '2023/09/03/14', '2023/09/03/15']

如果差异不重要,只需要flatten值,使用numpy:

input_df = pd.DataFrame(input, columns=['left', 'right'])

out = pd.Series(np.unique(np.ravel(input_df[['left','right']]))).dt.strftime("%Y/%m/%d/%H").tolist()
print (out)
['2023/09/01/10', '2023/09/01/11', '2023/09/02/12', 
 '2023/09/02/13', '2023/09/03/14', '2023/09/03/15']
stszievb

stszievb2#

您可以使用pandas有效地实现所需的结果,如下所示:

import pandas as pd
    
# Example list of lists of Pandas Timestamps
input_data = [
    [pd.Timestamp('2023-09-01 10:00:00'), pd.Timestamp('2023-09-01 11:00:00')],
    [pd.Timestamp('2023-09-02 12:00:00'), pd.Timestamp('2023-09-02 13:00:00')],
    [pd.Timestamp('2023-09-03 14:00:00'), pd.Timestamp('2023-09-03 15:00:00')]
]

# Create a DataFrame
input_df = pd.DataFrame(input_data, columns=['left', 'right'])

# Step 1: Flatten the input
flattened_df = input_df.stack().reset_index(drop=True)

# Step 2: Remove duplicates
unique_df = flattened_df.drop_duplicates()

# Step 3: Apply the same string format
unique_df['formatted'] = unique_df['right'].dt.strftime("%Y/%m/%d/%H")

# Resulting DataFrame with flattened, unique, and formatted timestamps
print(unique_df)
rqmkfv5c

rqmkfv5c3#

import pandas as pd
    
# Example list of lists of Pandas Timestamps
input_data = [
    [pd.Timestamp('2023-09-01 10:00:00'), pd.Timestamp('2023-09-01 11:00:00')],
    [pd.Timestamp('2023-09-02 12:00:00'), pd.Timestamp('2023-09-02 13:00:00')],
    [pd.Timestamp('2023-09-03 14:00:00'), pd.Timestamp('2023-09-03 15:00:00')]
]

# Create a DataFrame
input_df = pd.DataFrame(input_data, columns=['left', 'right'])

# Step 1: Flatten the input
flattened_df = input_df.stack().reset_index(drop=True)

# Step 2: Remove duplicates
unique_df = flattened_df.drop_duplicates()

# Step 3: Apply the same string format
unique_df['formatted'] = unique_df['right'].dt.strftime("%Y/%m/%d/%H")

# Resulting DataFrame with flattened, unique, and formatted timestamps
print(unique_df)

相关问题