Python数据框按日期滚动并拼接一个字符串
在 python dataframe rolling by date to get sum and concatinate a string 中,Furas展示了如何在滚动分组中连接一个字符串——交易ID。然而,这并没有解决问题。我需要带有它们所属分组的交易ID。
在下面的代码中:
print("\n--- the groups ---\n")
print( all_windows._grouper.groups )
返回的是:
print( all_windows._grouper.groups )
{(11608, '[email protected]', 116, 'Duffy's Lumber'): [2026-03-03 00:00:00],
(11608, '[email protected]', 116, 'Lowes'): [2026-02-09 00:00:00],
(11608, '[email protected]', 116, 'WB Mason'): [2026-01-03 00:00:00],
(11608, '[email protected]', 116, 'corner store'): [2025-12-03 00:00:00, 2025-12-20 00:00:00, 2025-12-20 00:00:00],
(11608, '[email protected]', 116, 'nino's pizza'): [2026-01-25 00:00:00, 2026-02-02 00:00:00],
(11608, '[email protected]', 608, 'Lowes'): [2026-01-29 00:00:00, 2026-02-05 00:00:00, 2026-02-15 00:00:00],
(11608, '[email protected]', 608, 'Staples'): [2026-01-05 00:00:00, 2026-01-06 00:00:00, 2026-01-06 00:00:00],
(11608, '[email protected]', 608, 'corner store'): [2025-12-10 00:00:00, 2025-12-31 00:00:00],
(11608, '[email protected]', 608, 'nino's pizza'): [2026-02-11 00:00:00],
(52846, '[email protected]', 456, 'Lowes'): [2025-12-10 00:00:00, 2025-12-31 00:00:00, 2026-01-06 00:00:00],
(52846, '[email protected]', 456, 'local hardware'): [2026-01-27 00:00:00, 2026-01-29 00:00:00],
(52846, '[email protected]', 456, 'nino's pizza'): [2026-02-11 00:00:00, 2026-03-03 00:00:00, 2026-04-10 00:00:00],
(52846, '[email protected]', 846, 'HARBOR FREIGHT'): [2025-12-02 00:00:00],
(52846, '[email protected]', 846, 'corner store'): [2026-02-02 00:00:00, 2026-02-05 00:00:00],
(52846, '[email protected]', 846, 'nino's pizza'): [2025-12-20 00:00:00, 2026-01-01 00:00:00],
(52846, '[email protected]', 846, 'pepe's pizza'): [2026-02-09 00:00:00],
(77400, '[email protected]', 400, 'Duffy's Lumber'): [2025-12-10 00:00:00, 2026-04-10 00:00:00, 2026-04-15 00:00:00],
(77400, '[email protected]', 400, 'HARBOR FREIGHT'): [2026-01-06 00:00:00, 2026-01-27 00:00:00, 2026-02-09 00:00:00],
(77400, '[email protected]', 400, 'WB Mason'): [2026-02-05 00:00:00],
(77400, '[email protected]', 707, 'Duffy's Lumber'): [2025-12-02 00:00:00, 2025-12-23 00:00:00, 2025-12-31 00:00:00, 2026-01-03 00:00:00],
(77400, '[email protected]', 707, 'HARBOR FREIGHT'): [2026-01-29 00:00:00],
(77400, '[email protected]', 707, 'WB Mason'): [2026-02-02 00:00:00, 2026-02-11 00:00:00]}
这些是在交易日期在10天内的分组。现在我需要相应的交易ID。
有没有办法对all_windows使用 "loc" 来获取交易ID?
我找不到实现的方法。
# -*- coding: utf-8 -*-
"""
Created on Fri Jun 5 11:29:36 2026
@author: ne098406
"""
# Source - https://stackoverflow.com/a/79951973
# Posted by furas, modified by community. See post 'Timeline' for change history
# Retrieved 2026-06-08, License - CC BY-SA 4.0
import io
import os
import pandas as pd
DATA = """
TRANSACTION DATE,EMPLOYEE ID,ACCOUNT EMAIL ADDRESS,ACCOUNT NUMBER,MERCHANT NAME,EXPENSE DESCRIPTION,TRANSACTION ID,TRANSACTION AMOUNT
2025-12-02,52846,[email protected],846,HARBOR FREIGHT,electrician tool,5454344019001,131.18
2025-12-10,52846,[email protected],456,Lowes,Pipe Insulation and fitting,5459405088001,34.79
2025-12-20,52846,[email protected],846,nino's pizza,lunch,5459405089001,98.98
2025-12-31,52846,[email protected],456,Lowes,nuts and bolts for maintenance,5471834423001,56.47
2026-01-01,52846,[email protected],846,nino's pizza,lunch,5471834424001,139
2026-01-06,52846,[email protected],456,Lowes,Cable Cutter Pliers,5347075493001,83.98
2026-01-27,52846,[email protected],456,local hardware,paint,5347075494001,242.37
2026-01-29,52846,[email protected],456,local hardware,Pipe Insulation and fitting,5357832073001,15.62
2026-02-02,52846,[email protected],846,corner store,OFFICE CLOCK,5361456559001,29.44
2026-02-05,52846,[email protected],846,corner store,office supplies,5386878553001,716.2
2026-02-09,52846,[email protected],846,pepe's pizza,lunch,5401420274001,642.2
2026-02-11,52846,[email protected],456,nino's pizza,lunch,5403179700001,29.15
2026-03-03,52846,[email protected],456,nino's pizza,lunch,5414434974001,105.9
2026-04-10,52846,[email protected],456,nino's pizza,lunch,5414434975001,191.27
2025-12-02,77400,[email protected],707,Duffy's Lumber,Nails,5350647122001,154.7
2025-12-10,77400,[email protected],400,Duffy's Lumber,screws,5353050810001,316.62
2025-12-23,77400,[email protected],707,Duffy's Lumber,Fittings for compressor,5356156974001,170.02
2025-12-31,77400,[email protected],707,Duffy's Lumber,fuses,5359620179001,62.84
2026-01-03,77400,[email protected],707,Duffy's Lumber,Nails,5372912596001,366.8
2026-01-06,77400,[email protected],400,HARBOR FREIGHT,bolts,5390241877001,748
2026-01-27,77400,[email protected],400,HARBOR FREIGHT,Cable Cutter Pliers,5401420255001,200
2026-01-29,77400,[email protected],707,HARBOR FREIGHT,bolts,5409512783001,47.49
2026-02-02,77400,[email protected],707,WB Mason,whiteboard calendar & desk calendar,5423349484001,34.91
2026-02-05,77400,[email protected],400,WB Mason,OFFICE CHAIR,5425031381001,48.99
2026-02-09,77400,[email protected],400,HARBOR FREIGHT,electrician tool,5425031382001,152.9
2026-02-11,77400,[email protected],707,WB Mason,mouse pad,5451761817001,34.03
2026-04-10,77400,[email protected],400,Duffy's Lumber,sump pump,5451761818001,25.73
2026-04-15,77400,[email protected],400,Duffy's Lumber,Insulation pipe and wrap,5473621360001,189.99
2025-12-03,11608,[email protected],116,corner store,spare keys,5403179702001,14.25
2025-12-10,11608,[email protected],608,corner store,coffee donuts,5403179703001,256.9
2025-12-20,11608,[email protected],116,corner store,coffee and donuts for all hands meeting,5403179704001,45.98
2025-12-20,11608,[email protected],116,corner store,Bottled Water,5403179705001,139.98
2025-12-31,11608,[email protected],608,corner store,Batteries,5405062431001,24.12
2026-01-03,11608,[email protected],116,WB Mason,envelopes,5406965833001,67.9
2026-01-05,11608,[email protected],608,Staples,whiteboard calendar & desk calendar,5406965834001,73.93
2026-01-06,11608,[email protected],608,Staples,office supplies,5412746497001,327
2026-01-06,11608,[email protected],608,Staples,office supplies,5416288516001,92.98
2026-01-25,11608,[email protected],116,nino's pizza,lunch for crew,5416288517001,43.75
2026-01-29,11608,[email protected],608,Lowes,electrician tool,5416288518001,54.99
2026-02-02,11608,[email protected],116,nino's pizza,meatball hero,5416288519001,39.4
2026-02-05,11608,[email protected],608,Lowes,nuts and bolts for maintenance,5416288520001,68.03
2026-02-09,11608,[email protected],116,Lowes,Cable Cutter Pliers,5416288521001,75.04
2026-02-11,11608,[email protected],608,nino's pizza,large pie,5416288522001,41.96
2026-03-03,11608,[email protected],116,Duffy's Lumber,tape measure,5416288523001,142.52
2026-02-15,11608,[email protected],608,Lowes,3/4 plywood,5416288524001,59.99
"""
DATE_COL = "TRANSACTION DATE"
DATE_FORMAT = "%Y-%m-%d"
GROUP_COLS = [
"EMPLOYEE ID",
"ACCOUNT EMAIL ADDRESS",
"ACCOUNT NUMBER",
"MERCHANT NAME",
]
df = pd.read_csv(io.StringIO(DATA), parse_dates=[DATE_COL], date_format=DATE_FORMAT)
df["TRANSACTION DATE"] = pd.to_datetime(df["TRANSACTION DATE"])
df.set_index("TRANSACTION DATE", inplace=True)
df.sort_index()
df["ACCOUNT NUMBER"] = df["ACCOUNT NUMBER"].astype("Int64")
df["TRANSACTION ID STR"] = df["TRANSACTION ID"].astype("string")
## ## df = df.sort_values(GROUP_COLS + [DATE_COL])
print("--- df ---")
print(df)
rollingSum = (
df.groupby(
["EMPLOYEE ID", "ACCOUNT EMAIL ADDRESS", "ACCOUNT NUMBER", "MERCHANT NAME"]
)
.rolling(window="11D")["TRANSACTION AMOUNT"]
.sum()
)
rollingCnt = (
df.groupby(
["EMPLOYEE ID", "ACCOUNT EMAIL ADDRESS", "ACCOUNT NUMBER", "MERCHANT NAME"]
)
.rolling(window="11D")["TRANSACTION ID"]
.count()
)
def version_0(df):
print("\n--- original version - doesn't work ---\n")
try:
rollingTransId = (
df.groupby(
[
"EMPLOYEE ID",
"ACCOUNT EMAIL ADDRESS",
"ACCOUNT NUMBER",
"MERCHANT NAME",
]
)
.rolling(window="11D")["TRANSACTION ID STR"]
.apply(lambda x: ",".join(x.dropna().astype(str)))
)
print("--- rollingTransId ---")
print(rollingTransId)
except Exception as ex:
print("Ex:", ex)
def version_1_a(df):
print("\n--- for-loop ---\n")
all_windows = df.groupby(
["EMPLOYEE ID", "ACCOUNT EMAIL ADDRESS", "ACCOUNT NUMBER", "MERCHANT NAME"]
).rolling(window="11D")["TRANSACTION ID STR"]
print("\n--- the groups ---\n")
print( all_windows._grouper.groups )
rollingTransId = []
for window in all_windows:
text = ",".join(window.dropna().astype(str))
rollingTransId.append(text)
print("--- rollingTransId ---")
print(rollingTransId)
def version_1_b(df):
print("\n--- list comprehension ---\n")
all_windows = df.groupby(
["EMPLOYEE ID", "ACCOUNT EMAIL ADDRESS", "ACCOUNT NUMBER", "MERCHANT NAME"]
).rolling(window="11D")["TRANSACTION ID STR"]
print("\n--- the groups ---\n")
print( all_windows._grouper.groups )
rollingTransId = [
",".join(window.dropna().astype(str)) for window in all_windows
]
print("--- rollingTransId ---")
print(rollingTransId)
def version_2(df):
print("\n--- Series ---\n")
all_windows = df.groupby(
["EMPLOYEE ID", "ACCOUNT EMAIL ADDRESS", "ACCOUNT NUMBER", "MERCHANT NAME"]
).rolling(window="11D")["TRANSACTION ID STR"]
print("\n--- the groups ---\n")
print( all_windows._grouper.groups )
all_windows = pd.Series(all_windows)
rollingTransId = all_windows.apply(
lambda window: ",".join(window.dropna().astype(str))
)
# rollingTransId = pd.Series(all_windows).apply(
# lambda window: ",".join(window.dropna().astype(str))
# )
print("--- rollingTransId ---")
print(rollingTransId.to_list())
def version_3(df):
print("\n--- DataFrame ---\n")
all_windows = df.groupby(
["EMPLOYEE ID", "ACCOUNT EMAIL ADDRESS", "ACCOUNT NUMBER", "MERCHANT NAME"]
).rolling(window="11D")["TRANSACTION ID STR"]
# print(f"{type(all_windows)=}")
print("\n--- the groups ---\n")
print( all_windows._grouper.groups )
all_windows = pd.DataFrame(all_windows)
rollingTransId = all_windows.apply(
lambda window: ",".join(window.dropna().astype(str))
)
print("--- rollingTransId ---")
print(rollingTransId)
# --- main ---
# version_0(df) # original # doesn't work
version_1_a(df) # for-loop # OK
version_1_b(df) # for-loop # OK
version_2(df) # Series # OK
# version_3(df) # DataFrame # doesn't work
解决方案
我想我找到了一个更简单的方法。至少对这段代码而言。但它也有一些弊端。
通常 .apply() 在 .rolling() 中只能创建 float/integer 的结果——因此它不能运行会创建字符串的函数。但你可以运行一个返回任意 float/integer 值的函数,它还会把字符串放到一个全局列表中,稍后你可以使用全局列表中的带字符串的值来替换列中的 float/integer 值。
它更短、更简单,也更易读。
并且它的输出与前一个问题中的 .sum() 或 .count() 相似。
它有一个问题:在把字符串传给函数之前会把它们转换成浮点数,因此需要额外的 astype(int)(用于在没有 .0 的情况下获取字符串),而当存在真正的文本如 "Hello World" 时它将不起作用。
可能在数值从整数/文本转换为浮点数再返回到整数/文本时存在近似的问题。但就这个示例而言,我没有看到这个问题。
def version_global_result(df):
def join_strings(data):
global global_list
text = ",".join(data.dropna().astype(int).astype(str))
global_list.append(text)
return 0 # anything (float/integer)
# ---
global global_list
global_list = [] # set empty before every execution
result = (
df.groupby(
["EMPLOYEE ID", "ACCOUNT EMAIL ADDRESS", "ACCOUNT NUMBER", "MERCHANT NAME"]
)
.rolling(window="11D")["TRANSACTION ID STR"]
.apply(join_strings)
)
result = result.astype(str) # to hide warning about wrong type of data
result[:] = global_list # replace values
print(result)
完整的测试代码:
import io
import os
import pandas as pd
DATA = """
TRANSACTION DATE,EMPLOYEE ID,ACCOUNT EMAIL ADDRESS,ACCOUNT NUMBER,MERCHANT NAME,EXPENSE DESCRIPTION,TRANSACTION ID,TRANSACTION AMOUNT
2025-12-02,52846,[email protected],846,HARBOR FREIGHT,electrician tool,5454344019001,131.18
2025-12-10,52846,[email protected],456,Lowes,Pipe Insulation and fitting,5459405088001,34.79
2025-12-20,52846,[email protected],846,nino's pizza,lunch,5459405089001,98.98
2025-12-31,52846,[email protected],456,Lowes,nuts and bolts for maintenance,5471834423001,56.47
2026-01-01,52846,[email protected],846,nino's pizza,lunch,5471834424001,139
2026-01-06,52846,[email protected],456,Lowes,Cable Cutter Pliers,5347075493001,83.98
2026-01-27,52846,[email protected],456,local hardware,paint,5347075494001,242.37
2026-01-29,52846,[email protected],456,local hardware,Pipe Insulation and fitting,5357832073001,15.62
2026-02-02,52846,[email protected],846,corner store,OFFICE CLOCK,5361456559001,29.44
2026-02-05,52846,[email protected],846,corner store,office supplies,5386878553001,716.2
2026-02-09,52846,[email protected],846,pepe's pizza,lunch,5401420274001,642.2
2026-02-11,52846,[email protected],456,nino's pizza,lunch,5403179700001,29.15
2026-03-03,52846,[email protected],456,nino's pizza,lunch,5414434974001,105.9
2026-04-10,52846,[email protected],456,nino's pizza,lunch,5414434975001,191.27
2025-12-02,77400,[email protected],707,Duffy's Lumber,Nails,5350647122001,154.7
2025-12-10,77400,[email protected],400,Duffy's Lumber,screws,5353050810001,316.62
2025-12-23,77400,[email protected],707,Duffy's Lumber,Fittings for compressor,5356156974001,170.02
2025-12-31,77400,[email protected],707,Duffy's Lumber,fuses,5359620179001,62.84
2026-01-03,77400,[email protected],707,Duffy's Lumber,Nails,5372912596001,366.8
2026-01-06,77400,[email protected],400,HARBOR FREIGHT,bolts,5390241877001,748
2026-01-27,77400,[email protected],400,HARBOR FREIGHT,Cable Cutter Pliers,5401420255001,200
2026-01-29,77400,[email protected],707,HARBOR FREIGHT,bolts,5409512783001,47.49
2026-02-02,77400,[email protected],707,WB Mason,whiteboard calendar & desk calendar,5423349484001,34.91
2026-02-05,77400,[email protected],400,WB Mason,OFFICE CHAIR,5425031381001,48.99
2026-02-09,77400,[email protected],400,HARBOR FREIGHT,electrician tool,5425031382001,152.9
2026-02-11,77400,[email protected],707,WB Mason,mouse pad,5451761817001,34.03
2026-04-10,77400,[email protected],400,Duffy's Lumber,sump pump,5451761818001,25.73
2026-04-15,77400,[email protected],400,Duffy's Lumber,Insulation pipe and wrap,5473621360001,189.99
2025-12-03,11608,[email protected],116,corner store,spare keys,5403179702001,14.25
2025-12-10,11608,[email protected],608,corner store,coffee donuts,5403179703001,256.9
2025-12-20,11608,[email protected],116,corner store,coffee and donuts for all hands meeting,5403179704001,45.98
2025-12-20,11608,[email protected],116,corner store,Bottled Water,5403179705001,139.98
2025-12-31,11608,[email protected],608,corner store,Batteries,5405062431001,24.12
2026-01-03,11608,[email protected],116,WB Mason,envelopes,5406965833001,67.9
2026-01-05,11608,[email protected],608,Staples,whiteboard calendar & desk calendar,5406965834001,73.93
2026-01-06,11608,[email protected],608,Staples,office supplies,5412746497001,327
2026-01-06,11608,[email protected],608,Staples,office supplies,5416288516001,92.98
2026-01-25,11608,[email protected],116,nino's pizza,lunch for crew,5416288517001,43.75
2026-01-29,11608,[email protected],608,Lowes,electrician tool,5416288518001,54.99
2026-02-02,11608,[email protected],116,nino's pizza,meatball hero,5416288519001,39.4
2026-02-05,11608,[email protected],608,Lowes,nuts and bolts for maintenance,5416288520001,68.03
2026-02-09,11608,[email protected],116,Lowes,Cable Cutter Pliers,5416288521001,75.04
2026-02-11,11608,[email protected],608,nino's pizza,large pie,5416288522001,41.96
2026-03-03,11608,[email protected],116,Duffy's Lumber,tape measure,5416288523001,142.52
2026-02-15,11608,[email protected],608,Lowes,3/4 plywood,5416288524001,59.99
"""
DATE_COL = "TRANSACTION DATE"
DATE_FORMAT = "%Y-%m-%d"
GROUP_COLS = [
"EMPLOYEE ID",
"ACCOUNT EMAIL ADDRESS",
"ACCOUNT NUMBER",
"MERCHANT NAME",
]
df = pd.read_csv(io.StringIO(DATA), parse_dates=[DATE_COL], date_format=DATE_FORMAT)
df["TRANSACTION DATE"] = pd.to_datetime(df["TRANSACTION DATE"])
df.set_index("TRANSACTION DATE", inplace=True)
df.sort_index()
df["ACCOUNT NUMBER"] = df["ACCOUNT NUMBER"].astype("Int64")
df["TRANSACTION ID STR"] = df["TRANSACTION ID"].astype("string")
# print("--- df ---")
# print(df)
def version_global_result(df):
def join_strings(data):
global global_list
text = ",".join(data.dropna().astype(int).astype(str))
global_list.append(text)
return 0 # anything (float/integer)
# ---
global global_list
global_list = [] # set empty before every execution
result = (
df.groupby(
["EMPLOYEE ID", "ACCOUNT EMAIL ADDRESS", "ACCOUNT NUMBER", "MERCHANT NAME"]
)
.rolling(window="11D")["TRANSACTION ID STR"]
.apply(join_strings)
)
# print(result)
# print(global_list)
result = result.astype(str) # to hide warning about wrong type of data
result[:] = global_list # replace values
print(result)
# df = pd.DataFrame(result)
# df["TRANSACTION ID STR"] = global_list
# print(df)
# --- main ---
version_global_result(df)
结果:
EMPLOYEE ID ACCOUNT EMAIL ADDRESS ACCOUNT NUMBER MERCHANT NAME TRANSACTION DATE
11608 [email protected] 116 Duffy's Lumber 2026-03-03 5416288523001
Lowes 2026-02-09 5416288521001
WB Mason 2026-01-03 5406965833001
corner store 2025-12-03 5403179702001
2025-12-20 5403179704001
2025-12-20 5403179704001,5403179705001
nino's pizza 2026-01-25 5416288517001
2026-02-02 5416288517001,5416288519001
608 Lowes 2026-01-29 5416288518001
2026-02-05 5416288518001,5416288520001
2026-02-15 5416288520001,5416288524001
Staples 2026-01-05 5406965834001
2026-01-06 5406965834001,5412746497001
2026-01-06 5406965834001,5412746497001,5416288516001
corner store 2025-12-10 5403179703001
2025-12-31 5405062431001
nino's pizza 2026-02-11 5416288522001
52846 [email protected] 456 Lowes 2025-12-10 5459405088001
2025-12-31 5471834423001
2026-01-06 5471834423001,5347075493001
local hardware 2026-01-27 5347075494001
2026-01-29 5347075494001,5357832073001
nino's pizza 2026-02-11 5403179700001
2026-03-03 5414434974001
2026-04-10 5414434975001
846 HARBOR FREIGHT 2025-12-02 5454344019001
corner store 2026-02-02 5361456559001
2026-02-05 5361456559001,5386878553001
nino's pizza 2025-12-20 5459405089001
2026-01-01 5471834424001
pepe's pizza 2026-02-09 5401420274001
77400 [email protected] 400 Duffy's Lumber 2025-12-10 5353050810001
2026-04-10 5451761818001
2026-04-15 5451761818001,5473621360001
HARBOR FREIGHT 2026-01-06 5390241877001
2026-01-27 5401420255001
2026-02-09 5425031382001
WB Mason 2026-02-05 5425031381001
707 Duffy's Lumber 2025-12-02 5350647122001
2025-12-23 5356156974001
2025-12-31 5356156974001,5359620179001
2026-01-03 5359620179001,5372912596001
HARBOR FREIGHT 2026-01-29 5409512783001
WB Mason 2026-02-02 5423349484001
2026-02-11 5423349484001,5451761817001
Name: TRANSACTION ID STR, dtype: object
如果你想保留其他值,那么你可以用字典来保存它们。
我做了一个关于索引(日期)的示例,但后来我发现它把错误的索引传给了函数——我也不知道为什么。不过我会把它保留为示例。
global_list = {"text": [], "dates": []}
def version_global_result(df):
def join_strings(data):
global global_list
text = ",".join(data.dropna().astype(int).astype(str))
global_list["text"].append(text)
dates = data.index.strftime("%Y-%m-%d").to_list()
global_list["dates"].append(dates)
return 0 # anything (float/integer)
# ---
global global_list
global_list = {"text": [], "dates": []} # set empty before every execution
result = (
df.groupby(
["EMPLOYEE ID", "ACCOUNT EMAIL ADDRESS", "ACCOUNT NUMBER", "MERCHANT NAME"]
)
.rolling(window="11D")["TRANSACTION ID STR"]
.apply(join_strings)
)
df = pd.DataFrame(result)
df["TRANSACTION ID STR"] = global_list["text"]
df["DATES"] = global_list["dates"]
print(df)
结果
EMPLOYEE ID ACCOUNT EMAIL ADDRESS ACCOUNT NUMBER MERCHANT NAME TRANSACTION DATE
11608 [email protected] 116 Duffy's Lumber 2026-03-03 5416288523001 [2025-12-02]
Lowes 2026-02-09 5416288521001 [2025-12-10]
WB Mason 2026-01-03 5406965833001 [2025-12-20]
corner store 2025-12-03 5403179702001 [2025-12-31]
2025-12-20 5403179704001 [2026-01-01]
2025-12-20 5403179704001,5403179705001 [2026-01-01, 2026-01-06]
nino's pizza 2026-01-25 5416288517001 [2026-01-27]
2026-02-02 5416288517001,5416288519001 [2026-01-27, 2026-01-29]
608 Lowes 2026-01-29 5416288518001 [2026-02-02]
2026-02-05 5416288518001,5416288520001 [2026-02-02, 2026-02-05]
2026-02-15 5416288520001,5416288524001 [2026-02-05, 2026-02-09]
Staples 2026-01-05 5406965834001 [2026-02-11]
2026-01-06 5406965834001,5412746497001 [2026-02-11, 2026-03-03]
2026-01-06 5406965834001,5412746497001,5416288516001 [2026-02-11, 2026-03-03, 2026-04-10]
corner store 2025-12-10 5403179703001 [2025-12-02]
2025-12-31 5405062431001 [2025-12-10]
nino's pizza 2026-02-11 5416288522001 [2025-12-23]
52846 [email protected] 456 Lowes 2025-12-10 5459405088001 [2025-12-31]
2025-12-31 5471834423001 [2026-01-03]
2026-01-06 5471834423001,5347075493001 [2026-01-03, 2026-01-06]
local hardware 2026-01-27 5347075494001 [2026-01-27]
2026-01-29 5347075494001,5357832073001 [2026-01-27, 2026-01-29]
nino's pizza 2026-02-11 5403179700001 [2026-02-02]
2026-03-03 5414434974001 [2026-02-05]
2026-04-10 5414434975001 [2026-02-09]
846 HARBOR FREIGHT 2025-12-02 5454344019001 [2026-02-11]
corner store 2026-02-02 5361456559001 [2026-04-10]
2026-02-05 5361456559001,5386878553001 [2026-04-10, 2026-04-15]
nino's pizza 2025-12-20 5459405089001 [2025-12-03]
2026-01-01 5471834424001 [2025-12-10]
pepe's pizza 2026-02-09 5401420274001 [2025-12-20]
77400 [email protected] 400 Duffy's Lumber 2025-12-10 5353050810001 [2025-12-20]
2026-04-10 5451761818001 [2025-12-31]
2026-04-15 5451761818001,5473621360001 [2025-12-31, 2026-01-03]
HARBOR FREIGHT 2026-01-06 5390241877001 [2026-01-05]
2026-01-27 5401420255001 [2026-01-06]
2026-02-09 5425031382001 [2026-01-06]
WB Mason 2026-02-05 5425031381001 [2026-01-25]
707 Duffy's Lumber 2025-12-02 5350647122001 [2026-01-29]
2025-12-23 5356156974001 [2026-02-02]
2025-12-31 5356156974001,5359620179001 [2026-02-02, 2026-02-05]
2026-01-03 5359620179001,5372912596001 [2026-02-05, 2026-02-09]
HARBOR FREIGHT 2026-01-29 5409512783001 [2026-02-11]
WB Mason 2026-02-02 5423349484001 [2026-03-03]
2026-02-11 5423349484001,5451761817001 [2026-03-03, 2026-02-15]
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。