diff --git a/lib/modules/versioning/pep440/index.spec.ts b/lib/modules/versioning/pep440/index.spec.ts
index eabcdf676ddd61a3f3eea63774d089b1216f1644..84fe37c5090bd98dd400fa76c1fb7e0df2bc754c 100644
--- a/lib/modules/versioning/pep440/index.spec.ts
+++ b/lib/modules/versioning/pep440/index.spec.ts
@@ -165,6 +165,9 @@ describe('modules/versioning/pep440/index', () => {
     ${'~=7.2'}              | ${'replace'}     | ${'7.2.0'}     | ${'8.0.1'}   | ${'~=8.0'}
     ${'~=7.2'}              | ${'replace'}     | ${'7.2.0'}     | ${'8'}       | ${'~=8.0'}
     ${'~=7.2.0'}            | ${'replace'}     | ${'7.2.0'}     | ${'8.2'}     | ${'~=8.2.0'}
+    ${'~=7.2'}              | ${'widen'}       | ${'7.2.0'}     | ${'8.0.1'}   | ${'>=7.2,<9'}
+    ${'~=7.2'}              | ${'widen'}       | ${'7.2.0'}     | ${'8'}       | ${'>=7.2,<9'}
+    ${'~=7.2.0'}            | ${'widen'}       | ${'7.2.0'}     | ${'8.2'}     | ${'>=7.2.0,<8.3'}
     ${'==3.2.*,>=3.2.2'}    | ${'replace'}     | ${'3.2.2'}     | ${'4.1.1'}   | ${'==4.1.*'}
     ${'==3.2.*,>=3.2.2'}    | ${'replace'}     | ${'3.2.2'}     | ${'4.0.0'}   | ${'==4.0.*'}
     ${'>=1.0.0,<1.1.0'}     | ${'replace'}     | ${'1.0.0'}     | ${'1.2.0'}   | ${'>=1.2.0,<1.3.0'}
diff --git a/lib/modules/versioning/pep440/range.ts b/lib/modules/versioning/pep440/range.ts
index 56920e731ac582f23ee87c3ae1122d1cf1793d17..ca7efbad6ce5e349e43dd8eb78cc5fada8da74d9 100644
--- a/lib/modules/versioning/pep440/range.ts
+++ b/lib/modules/versioning/pep440/range.ts
@@ -85,7 +85,7 @@ function getFutureVersion(
 
 interface Range {
   operator: string;
-  prefix: string;
+  prefix?: string;
   version: string;
 }
 
@@ -365,6 +365,23 @@ function trimTrailingZeros(numbers: number[]): number[] {
   return numbers.slice(0, i + 1);
 }
 
+function divideCompatibleReleaseRange(currentRange: Range): Range[] {
+  const currentVersionUpperBound = currentRange.version
+    .split('.')
+    .map((num) => parseInt(num));
+  if (currentVersionUpperBound.length > 1) {
+    currentVersionUpperBound.splice(-1);
+  }
+  currentVersionUpperBound[currentVersionUpperBound.length - 1] += 1;
+  return [
+    { operator: '>=', version: currentRange.version },
+    {
+      operator: '<',
+      version: currentVersionUpperBound.join('.'),
+    },
+  ];
+}
+
 function handleWidenStrategy(
   { currentValue, rangeStrategy, currentVersion, newVersion }: NewValueConfig,
   ranges: Range[]
@@ -375,7 +392,15 @@ function handleWidenStrategy(
   }
   let rangePrecision = getRangePrecision(ranges);
   const trimZeros = hasZeroSpecifier(ranges);
-  return ranges.map((range) => {
+  let newRanges: Range[] = [];
+  if (ranges.length === 1 && ranges[0].operator === '~=') {
+    // If range operator is '~=', divide the range into its logical equivalent.
+    // Example: ~=1.0 --> >=1.0,<2
+    newRanges = divideCompatibleReleaseRange(ranges[0]);
+  } else {
+    newRanges = ranges;
+  }
+  return newRanges.map((range) => {
     // newVersion is over the upper bound
     if (range.operator === '<' && gte(newVersion, range.version)) {
       const upperBound = parseVersion(range.version)?.release ?? [];